C# WinForm 中DataGridView数据刷新

时间:2022-08-30 22:58:06
在WinForm中有一DataGridView(dgvMx),数据源我绑定的是DataSet,List<T>我也试过,
private void ck_rkd_Form_Load(object sender, EventArgs e)
{
   this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'");
}
我想在界面上预添加数据行,最后保存整个DataSet,我现在在数据源中添加数据行时,DataGridView怎么也不刷新显示,试了很多方法都显示不出。
private void toolStripButton1_Click(object sender, EventArgs e)
{
   DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
   DataRow dr = dt.NewRow();
   dr["rkdId"] = "a";
   dr["wzId"] = "a";
   dr["pm"] = "a";
   dr["cz"] = "a";
   dr["gg"] = "a";
   dr["cd"] = "a";
   dr["dw"] = "a";
   dt.Rows.Add(dr);
   this.dgvMx.Refresh();
   this.dgvMx.Update();
   this.dgvMx.EndEdit();
}
在调试时,查看dt.rows.count会增加,怎么让DataGridView及时刷新显示。请高手们帮忙看看。

26 个解决方案

#1


最直接的方法  重新绑定一次

#2


添加数据后,调用一次下面的方法,就可以了
DataTable.AcceptChanges 方法 

private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  DataRow dr = dt.NewRow();
  dr["rkdId"] = "a";
  dr["wzId"] = "a";
  dr["pm"] = "a";
  dr["cz"] = "a";
  dr["gg"] = "a";
  dr["cd"] = "a";
  dr["dw"] = "a";
  dt.Rows.Add(dr);
  //this.dgvMx.Refresh();
  //this.dgvMx.Update();
  //this.dgvMx.EndEdit();
  dt.AcceptChanges();
}

#3


Ajax

#4


怎么重新绑定呀,this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'")这样吗?那我添加的数据呢?

#5



private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  DataRow dr = dt.NewRow();
  dr["rkdId"] = "a";
  dr["wzId"] = "a";
  dr["pm"] = "a";
  dr["cz"] = "a";
  dr["gg"] = "a";
  dr["cd"] = "a";
  dr["dw"] = "a";
  dt.Rows.Add(dr);
  this.dgvMx.Refresh();
  this.dgvMx.Update();
  this.dgvMx.EndEdit();
}


你的DataTable从dgvMx中取出,然后你在DataTable中加入数据,DataTable里面有数据是对的。
但是你的dgvMx绑定的数据是从方法GetDateSet("select * from ck_rkdMx where rkdId='-1'");中取出来的,是数据库中的结果  和你改变的那个DataTable不是相同的.



应该是这样

#6


dt.AcceptChanges();
刚试了下,刷新不了,是不是DataDridView属性要设置什么?

#7



((DataSet)this.dgvMx.DataSource).Tables[0];
如果知道数据集,就不要这么写,直接而
DataSet.AcceptChanges();

#8


我的意识是直接:

  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  DataRow dr = dt.NewRow();


修改成

  
  DataRow dr = dataset.Tables[0].NewRow();
  //......
  dataset.Tables[0].Rows.Add(dr);


#9


yabbi215老师,DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
这句代码所取的应该就是数据源里的DataTable吧。

#10


我没用过DataTable直接修改。  我都是新窗体让用户添加的 


那你在数据库 里面有你新添加的记录吗? 如果没有  可能是添加时出错把。。

#11


computerfox老师,这样修改代码的效果应该跟原代码一样吧,DataTable是引用类型的,我只是用DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];把它取出来添加行,

#12


添加的时候不写数据库,只是预添加,点保存的时候再Update这个DateSet来保存数据(写数据库)。

#13


this.dgvMx.DataSource = dt;

这样可以显示吗?

#14


datagridview新
DataSet ds = new DataSet();
SqlDataAdapter sda;

SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds);
this.dataGridView1.DataSource = ds.Tables[0];

#15


本帖最后由 ojlovecd 于 2010-05-19 00:13:52 编辑
我试了直接用DataTable为数据源,不用DataSet为数据源,如果更新DataTable里的数据DataGridView会直接刷新的。
this.dgvMx.DataSource = dsh.GetDateSet("select * from ck_rkdMx where rkdId='-1'").Tables[0];
private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = (DataTable)this.dgvMx.DataSource;
  DataRow dr = dt.NewRow();
  dr["rkdId"] = "a";
  dr["wzId"] = "a";
  dr["pm"] = "a";
  dr["cz"] = "a";
  dr["gg"] = "a";
  dr["cd"] = "a";
  dr["dw"] = "a";
  dt.Rows.Add(dr);
}

又试了下用List<T>做为数据源,当List<T>中添加条目时,DataGridView不会及时显示,有没有办法?

#16


引用 2 楼 computerfox 的回复:
添加数据后,调用一次下面的方法,就可以了
DataTable.AcceptChanges 方法 

C# code

private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  Data……

这个应该可以的吧

#17


DataSouse都要重新绑定吧!

#18


如果DataSouse重新绑定的话,原来设的标题就没有了,只有字段名了。

#19



最好不要直接绑定。
中间加一个bindingSource
之后所有的操作都有bindingSource来完成

DataTable tbl = YourTbl;

bindingSource1.DataSource = tbl;

dataGridView1.DataSource = bindingSource1;
//追加
bindingSource1.Add(YourNewData);
//删除当前行
bindingSource1.Remove(bindingSource1.Current);

#20


重新绑定一下数据源就好了,列绑定一下就好了,列名就不会更改了

#21


把更改的存入数据库 然后从新绑定下 就可以了

#22



 this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'");
 // 好像少了
   this.dgvMx.DataBind();


//你付了值没有绑定

#23


引用 22 楼 a82344626 的回复:
C# code

 this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'");
 // 好像少了
   this.dgvMx.DataBind();



//你付了值没有绑定


winform中好像没有DataBind()吧..

#24


移除,然后再重新绑定

#25


引用 15 楼 nlb_ch 的回复:
我试了直接用DataTable为数据源,不用DataSet为数据源,如果更新DataTable里的数据DataGridView会直接刷新的。

C# code
this.dgvMx.DataSource = dsh.GetDateSet("select * from ck_rkdMx where rkdId='-1'").Tables[0];
private void toolStripB……


要实现数据源更新时通知界面更新,就要实现IBindingList接口,在需要更新时触发ListChanged事件。DataTable实现了,而List没有实现,所以使用List是不会通知界面更新的。
DataSet本身并不是数据集合,而是实现了IListSource接口通过GetList方法返回数据集合,实际上就是返回的DataTable。但是,在Winform里界面是通过BindingContext来监听数据源是否更新的,所以虽然实际绑定的数据是DataTable,但是DataGridView监听的数据源还是原来的DataSet,而DataSet是不会触发ListChanged的事件的。

所以要自动刷新DataGridView,就要把DataSource绑定到实现了IBindingList接口的数据源。否则的话只能通过DataGridView.Refresh()手动刷新。

#26


引用 25 楼 danjiewu 的回复:
引用 15 楼 nlb_ch 的回复:
我试了直接用DataTable为数据源,不用DataSet为数据源,如果更新DataTable里的数据DataGridView会直接刷新的。

C# code
this.dgvMx.DataSource = dsh.GetDateSet("select * from ck_rkdMx where rkdId='-1'").Tables[0];
pr……


学习了

#1


最直接的方法  重新绑定一次

#2


添加数据后,调用一次下面的方法,就可以了
DataTable.AcceptChanges 方法 

private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  DataRow dr = dt.NewRow();
  dr["rkdId"] = "a";
  dr["wzId"] = "a";
  dr["pm"] = "a";
  dr["cz"] = "a";
  dr["gg"] = "a";
  dr["cd"] = "a";
  dr["dw"] = "a";
  dt.Rows.Add(dr);
  //this.dgvMx.Refresh();
  //this.dgvMx.Update();
  //this.dgvMx.EndEdit();
  dt.AcceptChanges();
}

#3


Ajax

#4


怎么重新绑定呀,this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'")这样吗?那我添加的数据呢?

#5



private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  DataRow dr = dt.NewRow();
  dr["rkdId"] = "a";
  dr["wzId"] = "a";
  dr["pm"] = "a";
  dr["cz"] = "a";
  dr["gg"] = "a";
  dr["cd"] = "a";
  dr["dw"] = "a";
  dt.Rows.Add(dr);
  this.dgvMx.Refresh();
  this.dgvMx.Update();
  this.dgvMx.EndEdit();
}


你的DataTable从dgvMx中取出,然后你在DataTable中加入数据,DataTable里面有数据是对的。
但是你的dgvMx绑定的数据是从方法GetDateSet("select * from ck_rkdMx where rkdId='-1'");中取出来的,是数据库中的结果  和你改变的那个DataTable不是相同的.



应该是这样

#6


dt.AcceptChanges();
刚试了下,刷新不了,是不是DataDridView属性要设置什么?

#7



((DataSet)this.dgvMx.DataSource).Tables[0];
如果知道数据集,就不要这么写,直接而
DataSet.AcceptChanges();

#8


我的意识是直接:

  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  DataRow dr = dt.NewRow();


修改成

  
  DataRow dr = dataset.Tables[0].NewRow();
  //......
  dataset.Tables[0].Rows.Add(dr);


#9


yabbi215老师,DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
这句代码所取的应该就是数据源里的DataTable吧。

#10


我没用过DataTable直接修改。  我都是新窗体让用户添加的 


那你在数据库 里面有你新添加的记录吗? 如果没有  可能是添加时出错把。。

#11


computerfox老师,这样修改代码的效果应该跟原代码一样吧,DataTable是引用类型的,我只是用DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];把它取出来添加行,

#12


添加的时候不写数据库,只是预添加,点保存的时候再Update这个DateSet来保存数据(写数据库)。

#13


this.dgvMx.DataSource = dt;

这样可以显示吗?

#14


datagridview新
DataSet ds = new DataSet();
SqlDataAdapter sda;

SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds);
this.dataGridView1.DataSource = ds.Tables[0];

#15


本帖最后由 ojlovecd 于 2010-05-19 00:13:52 编辑
我试了直接用DataTable为数据源,不用DataSet为数据源,如果更新DataTable里的数据DataGridView会直接刷新的。
this.dgvMx.DataSource = dsh.GetDateSet("select * from ck_rkdMx where rkdId='-1'").Tables[0];
private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = (DataTable)this.dgvMx.DataSource;
  DataRow dr = dt.NewRow();
  dr["rkdId"] = "a";
  dr["wzId"] = "a";
  dr["pm"] = "a";
  dr["cz"] = "a";
  dr["gg"] = "a";
  dr["cd"] = "a";
  dr["dw"] = "a";
  dt.Rows.Add(dr);
}

又试了下用List<T>做为数据源,当List<T>中添加条目时,DataGridView不会及时显示,有没有办法?

#16


引用 2 楼 computerfox 的回复:
添加数据后,调用一次下面的方法,就可以了
DataTable.AcceptChanges 方法 

C# code

private void toolStripButton1_Click(object sender, EventArgs e)
{
  DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
  Data……

这个应该可以的吧

#17


DataSouse都要重新绑定吧!

#18


如果DataSouse重新绑定的话,原来设的标题就没有了,只有字段名了。

#19



最好不要直接绑定。
中间加一个bindingSource
之后所有的操作都有bindingSource来完成

DataTable tbl = YourTbl;

bindingSource1.DataSource = tbl;

dataGridView1.DataSource = bindingSource1;
//追加
bindingSource1.Add(YourNewData);
//删除当前行
bindingSource1.Remove(bindingSource1.Current);

#20


重新绑定一下数据源就好了,列绑定一下就好了,列名就不会更改了

#21


把更改的存入数据库 然后从新绑定下 就可以了

#22



 this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'");
 // 好像少了
   this.dgvMx.DataBind();


//你付了值没有绑定

#23


引用 22 楼 a82344626 的回复:
C# code

 this.dgvMx.DataSource = GetDateSet("select * from ck_rkdMx where rkdId='-1'");
 // 好像少了
   this.dgvMx.DataBind();



//你付了值没有绑定


winform中好像没有DataBind()吧..

#24


移除,然后再重新绑定

#25


引用 15 楼 nlb_ch 的回复:
我试了直接用DataTable为数据源,不用DataSet为数据源,如果更新DataTable里的数据DataGridView会直接刷新的。

C# code
this.dgvMx.DataSource = dsh.GetDateSet("select * from ck_rkdMx where rkdId='-1'").Tables[0];
private void toolStripB……


要实现数据源更新时通知界面更新,就要实现IBindingList接口,在需要更新时触发ListChanged事件。DataTable实现了,而List没有实现,所以使用List是不会通知界面更新的。
DataSet本身并不是数据集合,而是实现了IListSource接口通过GetList方法返回数据集合,实际上就是返回的DataTable。但是,在Winform里界面是通过BindingContext来监听数据源是否更新的,所以虽然实际绑定的数据是DataTable,但是DataGridView监听的数据源还是原来的DataSet,而DataSet是不会触发ListChanged的事件的。

所以要自动刷新DataGridView,就要把DataSource绑定到实现了IBindingList接口的数据源。否则的话只能通过DataGridView.Refresh()手动刷新。

#26


引用 25 楼 danjiewu 的回复:
引用 15 楼 nlb_ch 的回复:
我试了直接用DataTable为数据源,不用DataSet为数据源,如果更新DataTable里的数据DataGridView会直接刷新的。

C# code
this.dgvMx.DataSource = dsh.GetDateSet("select * from ck_rkdMx where rkdId='-1'").Tables[0];
pr……


学习了