C# WinForm 中DataGridView数据刷新

nlb_ch 2010-05-18 05:50:27
在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及时刷新显示。请高手们帮忙看看。
...全文
13658 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
danjiewu 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 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……
[/Quote]

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

所以要自动刷新DataGridView,就要把DataSource绑定到实现了IBindingList接口的数据源。否则的话只能通过DataGridView.Refresh()手动刷新。
q308720227 2010-05-19
  • 打赏
  • 举报
回复
移除,然后再重新绑定
Mark杨 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 a82344626 的回复:]
C# code

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



//你付了值没有绑定
[/Quote]

winform中好像没有DataBind()吧..
a82344626 2010-05-19
  • 打赏
  • 举报
回复

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


//你付了值没有绑定
taikonhmao67 2010-05-19
  • 打赏
  • 举报
回复
把更改的存入数据库 然后从新绑定下 就可以了
wangwenzhuang 2010-05-19
  • 打赏
  • 举报
回复
重新绑定一下数据源就好了,列绑定一下就好了,列名就不会更改了
535cheng110 2010-05-19
  • 打赏
  • 举报
回复

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

DataTable tbl = YourTbl;

bindingSource1.DataSource = tbl;

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

nlb_ch 2010-05-19
  • 打赏
  • 举报
回复
如果DataSouse重新绑定的话,原来设的标题就没有了,只有字段名了。
Mark杨 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 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……
[/Quote]

学习了
lvfeng19806001 2010-05-18
  • 打赏
  • 举报
回复
DataSouse都要重新绑定吧!
A阿_Qiang 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 computerfox 的回复:]
添加数据后,调用一次下面的方法,就可以了
DataTable.AcceptChanges 方法

C# code

private void toolStripButton1_Click(object sender, EventArgs e)
{
DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
Data……
[/Quote]
这个应该可以的吧
nlb_ch 2010-05-18
  • 打赏
  • 举报
回复
我试了直接用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不会及时显示,有没有办法?
wuyq11 2010-05-18
  • 打赏
  • 举报
回复
datagridview新
DataSet ds = new DataSet();
SqlDataAdapter sda;

SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds);
this.dataGridView1.DataSource = ds.Tables[0];
Mark杨 2010-05-18
  • 打赏
  • 举报
回复
this.dgvMx.DataSource = dt;

这样可以显示吗?
nlb_ch 2010-05-18
  • 打赏
  • 举报
回复
添加的时候不写数据库,只是预添加,点保存的时候再Update这个DateSet来保存数据(写数据库)。
nlb_ch 2010-05-18
  • 打赏
  • 举报
回复
computerfox老师,这样修改代码的效果应该跟原代码一样吧,DataTable是引用类型的,我只是用DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];把它取出来添加行,
Mark杨 2010-05-18
  • 打赏
  • 举报
回复
我没用过DataTable直接修改。 我都是新窗体让用户添加的


那你在数据库 里面有你新添加的记录吗? 如果没有 可能是添加时出错把。。
nlb_ch 2010-05-18
  • 打赏
  • 举报
回复
yabbi215老师,DataTable dt = ((DataSet)this.dgvMx.DataSource).Tables[0];
这句代码所取的应该就是数据源里的DataTable吧。
捷哥1999 2010-05-18
  • 打赏
  • 举报
回复
我的意识是直接:

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


修改成


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


捷哥1999 2010-05-18
  • 打赏
  • 举报
回复

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

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧