2013-12-03 77 views
1

我在我的.NET 4.5 WinForms應用程序中有兩列DataGridView。一列是常規文本框列,另一列是DataGridViewComboBoxColumn,它是一個下拉列表。我試圖將列綁定到我的Filter對象的BindingList,我希望枚舉FilterType中的所有內容都顯示在下拉列表中。下面是我的對象和枚舉代碼:ComboBox列上的DataGridView默認錯誤

public class Filter 
{ 
    public string keyword { get; set; } 
    public FilterType type { get; set; } 
} 

public enum FilterType : int //the strings should appear in the dropdown 
{ 
    SESSION = 1, 
    ORDER = 2, 
    SHIPMENT = 3 
} 

我手動創建的列在VS 2012的設計師,我改變了ColumnTypeHeaderText,並DataPropertyNamekeywordtype
使用一個答案,我發現我here的這兩行代碼添加到我的窗體加載事件:

colFilterType.DataSource = Enum.GetValues(typeof(FilterType)); 
colFilterType.ValueType = typeof(FilterType); 

當我運行代碼,我最初看到一個空白行。無論何時點擊該行,無論點擊哪個列,都會出現彈出錯誤。

System.ArgumentException:DataGridViewComboBoxCell值無效。 ...請處理DataError事件。

我可以忽略它,然後輸入我想要的任何文本放入Keyword列,下拉奇蹟般地與枚舉的第一個值填充。但是,如果我將鼠標懸停在下拉菜單上,該錯誤又會彈出(請參閱屏幕截圖)。我不確定是什麼導致了錯誤,也不知道在哪裏設置斷點。我也不知道是否通過在設計器中創建DataGridView的某些部分並修改代碼中的部分來創建問題。設計者不允許我按照我在代碼中所做的方式設置DataSource。它還包含我在代碼中未見過的字段ValueMember

enter image description here

雖然不是很理想,我不會介意捕捉錯誤,並用它做什麼,因爲下拉似乎填充自身(並假設所有的數據保持不變)。

回答

2

在運行時添加列時,您的代碼正常工作。示例代碼:

DataGridViewComboBoxColumn colFilterType = new DataGridViewComboBoxColumn(); 
colFilterType.HeaderText = "Name you want"; 
colFilterType.DataSource = Enum.GetValues(typeof(FilterType)); 
colFilterType.ValueType = typeof(FilterType); 
dataGridView1.Columns.Add(colFilterType); 

錯誤,因爲這些都會觸發一個DataGridView以任何方式影響時間的大事件數像你彙報,同時在運行時更改單元格/列的類型通常挑起的一個, :他們中的一些人期待舊的類型,並找到新元素(例如,期望int並找到string)。

+0

這工作,並感謝您的提示!但是,每當添加新行時,新下拉列表都是空白的。然後,我需要點擊下拉列表來重點關注,再次點擊它,然後再次點擊以最終打開它。這是'DataGridView'的另一個怪癖嗎?或者你知道我能否以某種方式解決這個問題? – valsidalv

+0

@valsidalv不客氣。新行是空白的,因爲它默認不選擇任何項目;通過強制選擇的項目成爲你想要的項目來改變這一點。 – varocarbas

+0

我確實發現了一個問題。必須將字段'colFilterType.DataPropertyName'設置爲''type「',以便DataGridView中的更改能夠在'Filter'的綁定列表中正確更新,否則它們全部顯示爲'0'。添加此綁定會導致錯誤。 – valsidalv