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 方法
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属性要设置什么?
刚试了下,刷新不了,是不是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吧。
这句代码所取的应该就是数据源里的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];
DataSet ds = new DataSet();
SqlDataAdapter sda;
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds);
this.dataGridView1.DataSource = ds.Tables[0];
#15
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
这个应该可以的吧
#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
winform中好像没有DataBind()吧..
#24
移除,然后再重新绑定
#25
要实现数据源更新时通知界面更新,就要实现IBindingList接口,在需要更新时触发ListChanged事件。DataTable实现了,而List没有实现,所以使用List是不会通知界面更新的。
DataSet本身并不是数据集合,而是实现了IListSource接口通过GetList方法返回数据集合,实际上就是返回的DataTable。但是,在Winform里界面是通过BindingContext来监听数据源是否更新的,所以虽然实际绑定的数据是DataTable,但是DataGridView监听的数据源还是原来的DataSet,而DataSet是不会触发ListChanged的事件的。
所以要自动刷新DataGridView,就要把DataSource绑定到实现了IBindingList接口的数据源。否则的话只能通过DataGridView.Refresh()手动刷新。
#26
学习了
#1
最直接的方法 重新绑定一次
#2
添加数据后,调用一次下面的方法,就可以了
DataTable.AcceptChanges 方法
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属性要设置什么?
刚试了下,刷新不了,是不是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吧。
这句代码所取的应该就是数据源里的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];
DataSet ds = new DataSet();
SqlDataAdapter sda;
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds);
this.dataGridView1.DataSource = ds.Tables[0];
#15
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
这个应该可以的吧
#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
winform中好像没有DataBind()吧..
#24
移除,然后再重新绑定
#25
要实现数据源更新时通知界面更新,就要实现IBindingList接口,在需要更新时触发ListChanged事件。DataTable实现了,而List没有实现,所以使用List是不会通知界面更新的。
DataSet本身并不是数据集合,而是实现了IListSource接口通过GetList方法返回数据集合,实际上就是返回的DataTable。但是,在Winform里界面是通过BindingContext来监听数据源是否更新的,所以虽然实际绑定的数据是DataTable,但是DataGridView监听的数据源还是原来的DataSet,而DataSet是不会触发ListChanged的事件的。
所以要自动刷新DataGridView,就要把DataSource绑定到实现了IBindingList接口的数据源。否则的话只能通过DataGridView.Refresh()手动刷新。
#26
学习了