2011-11-20 52 views
1

我的主表單/詳細信息表單使用未綁定的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); 

回答

0

的問題是,你正試圖從一個行事件中清除行( RowEnter)。這幾乎肯定會拋出你需要捕捉的異常。

潛在的問題是重新綁定數據網格。我很確定,每次保存數據時都不需要這樣做。最需要做的是保存詳細信息部分中特定客戶的內容。

如果您的基礎數據源支持IBindingList,那麼您所要做的就是從網格中獲取客戶記錄,並使用表單中的值更新它。數據綁定應負責更新網格內容。

請參閱DataSource屬性上的MSDN documentation以獲取更多信息。

+0

關於潛在問題的好處有修改,所以我只更新DataGridViewRow更改的客戶。我需要從心理上解決它的只讀問題,所以不管我對值做什麼,它都不影響實際的數據庫。 我的客戶數據是一個IList,因此它應該很容易轉換爲IBindingList並使用它。然而,當我試圖按照MSDN修改我的代碼時,我得到了NullReference異常('dataGridView1.DataSource = bindingSource1'),雖然這對我來說看起來很有趣和新穎(我是一個交易的web開發人員,這對我來說都是新的) –

+0

現在我沒有清除行事件中的行,該方法的其餘部分正常執行;奇怪的是它似乎沒有拋出任何異常,我可以在調試器中直接調用它。 –

+0

您不應該需要bindingsource1,您應該可以直接將DataSource設置爲您的客戶集合。首先實現IBindingList看起來有點棘手,但如果你開始簡單(不要嘗試實現搜索和排序),你應該能夠很快地將其淘汰。 –

相關問題