如何在不提出“已提供的行已属于DataGridView”错误的情况下缓存行?

时间:2009-02-28 20:28:44

标签: c# .net winforms datagridview

我想在'刷新'之间缓存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);
        }
    }

这是在包含DataGridViewButton的表单上完成的。单击该按钮两次会显示“提供的行已属于DataGridView”错误。

网上有一些关于此的讨论表明它可能是一个错误,但这是在2004年左右。

3 个答案:

答案 0 :(得分:2)

一旦行是gridview的一部分,您就无法重新添加它。行本身keeps track of what DataGridView它在。我建议制作缓存行的副本并将副本添加到视图中。因为每次它不在视图中时都会创建一个新副本。或者,您可以浏览并仅删除那些尚未从视图中缓存的行,将缓存的行留在后面,这样您就不需要重新添加它了。

答案 1 :(得分:1)

将其克隆到DataRow(),然后DataTable.ImportRow克隆到原始DataTable

答案 2 :(得分:0)

我不确定你为什么要这个行为?您应该只删除要删除的网格中的行。

您应该研究实现ObservableCollection和Binding组件。这样,如果从对象模型中删除了某个项目,则会自动从网格中删除该项目。这样可以省去执行听起来像手动数据绑定的操作,并完全避免这个问题。

如果您正在使用DataSet或键入的DataSet,那么您已经实现了可观察的功能 - 您只需将数据表绑定到网格即可。如果你在内存中有一个表对象,你会注意到你可以加载另一个,然后使用DataTable.Merge函数来组合结果。