更新添加到未绑定的WinForms DataGridView的行会无声地失败 - 为什么?

时间:2011-11-20 19:35:53

标签: c# winforms datagridview

我的主/详细信息表单使用未绑定的DataGridView列出与过滤器主要部分匹配的客户)在DataGridView中选择行(RowEnter)使用值填充详细信息部分。我有一个工作保存按钮,保存表单,重新绑定数据网格,然后重置表单。问题是当细节改变时更新DataGridView,现在bind方法得到dataGridView1.Rows.Clear()然后退出但没有给出错误。

我需要获取要保存的表单和要更新的网格,我还需要了解为什么我目前所获得的不起作用。

private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
    {
        DataGridViewCell dgc = dataGridView1["ID", int.Parse(e.RowIndex.ToString())];
        Guid customerID = Guid.Parse(dgc.Value.ToString());

        if (IsPageValid() && dataGridView1.Focused)
        {
            if (KeepChanges())
            {
                SaveForm();
                BindDataGrid(string.Empty);
            }
        }            

        Customer = _customerRepo.GetByID(customerID);
        BindCustomerDetails(Customer);
    }

我们的想法是加载表单并选择客户,在表单上更改一些详细信息,然后选择新客户(在网格中选择另一行)并且有未提交的更改。 IsPageValid检查表单上的详细信息是否会创建有效的客户。 KeepChanges从MessageBox返回YesNo(“此记录有更改。是否要保留它们?”)如果用户单击“是”,则调用SaveForm()以保留详细信息。然后调用BindDataGrid(string.Empty)。到目前为止一切都很好,在Form_Load()上调用BindDataGrid(string.Empty),但是这次当命中行dataGridView1.Rows.Clear()时,调试器停止并且控制权返回给程序,没有一个超出该方法中的代码的代码被执行,我无法理解为什么。

public void BindDataGrid(String filterText)
    {
        var customers = String.IsNullOrEmpty(filterText) ? _customerRepo.GetAll() : _customerRepo.GetFiltered(filterText);

        dataGridView1.Rows.Clear();
        dataGridView1.ColumnCount = 5;
        dataGridView1.Columns[0].Name = "ID";
        dataGridView1.Columns[0].Visible = false;
        dataGridView1.Columns[1].Name = "Name";
        dataGridView1.Columns[2].Name = "Address";
        dataGridView1.Columns[2].FillWeight = 300;
        dataGridView1.Columns[3].Name = "Phone";
        dataGridView1.Columns[3].FillWeight = 80;
        dataGridView1.Columns[4].Name = "Mobile";
        dataGridView1.Columns[4].FillWeight = 80;

        foreach (var customer in customers)
        {
            String address = String.IsNullOrEmpty(customer.Address.Street) ? "no address" : String.Format("{0}, {1}, {2}, {3}", customer.Address.Street, customer.Address.Town, customer.Address.County, customer.Address.Postcode);
            dataGridView1.Rows.Add(customer.ID, customer.ToString(), address, customer.Address.Phone, customer.Mobile);
        }
    }

我尝试将其更改为使用DataTable,将DataBinding设置为null并使用DataBinding对象,但它们似乎都遇到了同样的问题。 DataGridView似乎不更新或允许更新。这个来自designer.cs文件,似乎没有任何东西可以阻止我,据我所知:

// dataGridView1
        // 
        this.dataGridView1.AllowUserToAddRows = false;
        this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.dataGridView1.Location = new System.Drawing.Point(4, 4);
        this.dataGridView1.Name = "dataGridView1";
        this.dataGridView1.ReadOnly = true;
        this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
        this.dataGridView1.Size = new System.Drawing.Size(736, 330);
        this.dataGridView1.TabIndex = 5;
        this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowEnter);

1 个答案:

答案 0 :(得分:0)

问题是您正在尝试清除行事件(RowEnter)中的行。这几乎肯定会引发你需要捕获的异常。

潜在的问题是重新绑定数据网格。我很确定您每次保存数据时都不需要这样做。您需要做的最多是保存详细信息部分中特定客户的内容。

如果基础数据源支持IBindingList,那么您需要做的就是从网格中获取客户记录并使用表单中的值进行更新。数据绑定应该注意更新网格内容。

有关详细信息,请参阅DataSource属性上的MSDN documentation