我想在'刷新'之间缓存DataGridView
行,即在Rows.Clear()
和Columns.Clear()
之间。但是,似乎调用Clear()
方法并不解除DataGridView
实例中的数据绑定,例如,
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataGridViewRow cachedRow = new DataGridViewRow();
private void button1_Click(object sender, EventArgs e)
{
this.dataGridView1.Rows.Clear();
this.dataGridView1.Columns.Clear();
DataGridViewColumn aColumn = new DataGridViewTextBoxColumn();
this.dataGridView1.Columns.Add(aColumn);
this.dataGridView1.Rows.Add(cachedRow);
}
}
这是在包含DataGridView
和Button
的表单上完成的。单击该按钮两次会显示“提供的行已属于DataGridView”错误。
网上有一些关于此的讨论表明它可能是一个错误,但这是在2004年左右。
答案 0 :(得分:2)
一旦行是gridview的一部分,您就无法重新添加它。行本身keeps track of what DataGridView它在。我建议制作缓存行的副本并将副本添加到视图中。因为每次它不在视图中时都会创建一个新副本。或者,您可以浏览并仅删除那些尚未从视图中缓存的行,将缓存的行留在后面,这样您就不需要重新添加它了。
答案 1 :(得分:1)
将其克隆到DataRow()
,然后DataTable.ImportRow
克隆到原始DataTable
。
答案 2 :(得分:0)
我不确定你为什么要这个行为?您应该只删除要删除的网格中的行。
您应该研究实现ObservableCollection和Binding组件。这样,如果从对象模型中删除了某个项目,则会自动从网格中删除该项目。这样可以省去执行听起来像手动数据绑定的操作,并完全避免这个问题。
如果您正在使用DataSet或键入的DataSet,那么您已经实现了可观察的功能 - 您只需将数据表绑定到网格即可。如果你在内存中有一个表对象,你会注意到你可以加载另一个,然后使用DataTable.Merge函数来组合结果。