我的主表單/詳細信息表單使用未綁定的DataGridView來列出與過濾器主機部分相匹配的客戶)在DataGridView中選擇一行(RowEnter)將值填入詳細信息部分。我有一個工作的保存按鈕,保存表單,重新綁定數據網格,然後重置表單。問題是當細節發生變化時更新DataGridView,現在綁定方法獲取儘可能遠的dataGridView1.Rows.Clear()然後退出但沒有錯誤。更新行添加到未綁定的WinForms DataGridView失敗 - 爲什麼?
我需要得到窗體來保存和更新網格,我也需要了解爲什麼我目前得到的不起作用。
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(「這個記錄有變化,是否要保留它們?」)如果用戶單擊Yes,則調用SaveForm()以保留細節。然後調用BindDataGrid(string.Empty)。一切都很好,到目前爲止,BindDataGrid(string.Empty)在Form_Load()上被調用,但是這一次當行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,設置數據綁定爲null,並使用數據綁定對象,但他們似乎都遇到了同樣的問題。 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);
關於潛在問題的好處有修改,所以我只更新DataGridViewRow更改的客戶。我需要從心理上解決它的只讀問題,所以不管我對值做什麼,它都不影響實際的數據庫。 我的客戶數據是一個IList,因此它應該很容易轉換爲IBindingList並使用它。然而,當我試圖按照MSDN修改我的代碼時,我得到了NullReference異常('dataGridView1.DataSource = bindingSource1'),雖然這對我來說看起來很有趣和新穎(我是一個交易的web開發人員,這對我來說都是新的) –
現在我沒有清除行事件中的行,該方法的其餘部分正常執行;奇怪的是它似乎沒有拋出任何異常,我可以在調試器中直接調用它。 –
您不應該需要bindingsource1,您應該可以直接將DataSource設置爲您的客戶集合。首先實現IBindingList看起來有點棘手,但如果你開始簡單(不要嘗試實現搜索和排序),你應該能夠很快地將其淘汰。 –