2009-08-27 16 views
4

當處理DataGridView的細胞,你通常做:如何安全地訪問DataGridView列名稱?

MyGrid.CurrentRow.Cells["EmployeeFirstName"].Value = "John"; 

這是所有罰款和花花公子,但隨着複雜度的提高,你開始擔心拼寫錯誤,重構問題等

從歷史上看,我只是做了這些列是公開的,所以我可以直接在類實例中訪問它們,但是我必須與Windows窗體設計器進行對抗,因爲這是很好的做法。

我目前的解決方案是有一個叫列數類,它有一堆字符串:

public static class Cols 
{ 
    public static string EmployeeFirstName = "EmployeeFirstName"; 
    ... 
} 

導致此:

MyGrid.CurrentRow.Cells[Cols.EmployeeFirstName].Value = "John"; 

這給了我一些智能感知善良,而不是等待運行時錯誤。儘管如此,它依然隱約可見。

有沒有更方便的方法來做到這一點?

回答

-2

您可以使用索引來訪問你的列:

MyGrid.CurrentRow.Cells [1] .value的= 「約翰」;

+3

這是如何保存的?如果列索引改變,你擰... – Colin 2009-08-27 15:51:45

6

如果您已在設計時創建了列,則可以爲其指定明智的名稱,例如employeeFirstNameColumn。

MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Name] 

或可能:

然後你可以使用像得到一個細胞

MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Index] 

如果你動態生成的列(的AutoGenerateColumns = TRUE),你就會有列索引基於您綁定的數據源的列索引。所以你可能能夠使用類似的技巧來派生索引(尤其是如果你的數據源是強類型的DataSet)。

+0

我一直在讀一點,似乎我試圖通過雙方都希望堅持「所有成員都是私人」的行爲Windows窗體設計器,但仍希望完全訪問實際使用表單的類實例。 我想,這是拿它或離開它。儘管感謝您的想法。 – Teetow 2009-08-27 19:41:03

+0

我知道這是一個老問題,但我只是想添加一個註釋['DataGridViewRow'](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewrow%28v= vs.100%29.aspx)(由MyGrid返回的類型。CurrentRow')實際上不具有* .Columns屬性。我認爲答案應該是'.Cells'。 – 2012-08-13 20:08:30

0

防止運行時問題的唯一方法是在嘗試訪問不存在的Cells項目時捕獲ArgumentException。例如:

private void SetCellValue(DataGridViewCellCollection cells, string col, object value) 
{ 
    try 
    { 
    cells[col].Value = value; 
    } 
    catch (Exception ex) 
    { 
    Console.WriteLine(string.Format("Failed to set cell {0} to {1} Error={2}",col,value,ex.Message)); 
    } 
} 
1

你可以做的就是這個

for (int x = 0;x <tbl.Rows.Count;x++)//iterate through tables 
     { 
      Dataset.TableNameRow record = tbl[x]; 
      dataGridView1.Rows.Add(); 
      dataGridView1[colHandoffDate.Name,x].Value = record.HandoffDate; 
      .... 

我手動添加的列,所以你可以在智能感知找到他們,他們的名字(這樣你就不必創建帶字符串的類)