2010-11-08 81 views
11

爲了在此DatagridViewComboBox中顯示ReadAccess枚舉成員,還需要做些什麼?如何在DataGridViewComboBox中顯示枚舉類型成員?

ReadDataGridViewComboBoxColumn.Items.Clear(); 
ReadDataGridViewComboBoxColumn.Items.AddRange(ReadAccess.None, ReadAccess.Allowed); 
ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 

這裏是關於DataGridView的設計器生成的代碼:

this.rolesDataGridView.AutoGenerateColumns = false; 
this.rolesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
this.TableNameDataGridViewTextBoxColumn, 
this.ReadDataGridViewComboBoxColumn, 
this.WriteDataGridViewComboBoxColumn, 
this.ReadCodeDataGridViewComboBoxColumn, 
this.ProcessDataGridViewCheckBoxColumn, 
this.AdministrateDataGridViewCheckBoxColumn}); 
this.rolesDataGridView.DataSource = this.bsTablePermissions;

終於,在InitializeComponent();後,我設置的DataGridView的DataSource:

this.rolesDataGridView.DataSource = this.RoleTablePermissions; // a bindingsource list
+0

你完成了'this.Controls.Add(ReadDataGridViewComboBoxColumn)'或類似嗎? – 2010-11-08 02:41:01

+0

@George:是的,當然...但是當我運行該項目時,組合框被凍結,我無法打開它的列表... – 2010-11-08 02:44:49

+0

是否有更多的代碼來實例化DataGridView比這隻? – 2010-11-08 02:50:48

回答

21

這是一個問題,我」我遇到過很多次了。 DataGridViewComboBoxColumn不知道如何協調枚舉的字符串表示和其整數值之間的差異。即使您將ValueType設置爲枚舉類型,DataGridView也會嘗試將單元格的值設置爲基本的int值 - 這就是在數據綁定期間將引發FormatException的原因。

我發現克服這個問題的唯一方法就是將DataGridViewComboBoxColumn綁定到將字符串值與整數值分開的數據源。您可以使用匿名類型用於這一目的:

ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 
ReadDataGridViewComboBoxColumn.ValueMember = "Value"; 
ReadDataGridViewComboBoxColumn.DisplayMember = "Display"; 
ReadDataGridViewComboBoxColumn.DataSource = new ReadAccess[] 
    { ReadAccess.None, ReadAccess.Allowed } 
    .Select(value => new { Display=value.ToString(), Value=(int)value }) 
    .ToList(); 

這樣,DataGridView知道如何與與其格式化值單元格的值。

+0

哇...真好!非常感謝... – 2010-11-08 16:29:36

+0

@Bradley:我仍然有這個問題...組合框仍然凍結,我不能打開列表,並且,我收到'FormatException' ... – 2010-11-08 18:03:49

+0

@Dr TJ:是否有可能你的'DataGridView'中的其他列之一導致了問題,現在你已經解決了這個問題?檢查您的處理程序中的'ColumnIndex'屬性是否存在DataError事件。 – 2010-11-08 23:05:47

8

添加到布拉德利·史密斯給出了答案:一是可以得到所有枚舉值(而不是命名每個單獨)輕鬆地使用此代碼:

ReadDataGridViewComboBoxColumn.DataSource = 
     new List<ReadAccess>((ReadAccess[]) Enum.GetValues(typeof(ReadAccess))) 
     .Select(value => new { Display=value.ToString(), Value=(int)value }) 
     .ToList(); 
2

你應該枚舉值不能轉換成int類型。如果你有喜歡「無效值」的錯誤使用此代碼:

ReadDataGridViewComboBoxColumn.DataSource = new ReadAccess[] 
{ ReadAccess.None, ReadAccess.Allowed } 
.Select(value => new { Display=value.ToString(), Value=value }) 
.ToList(); 
0

的改進,以接受的答案: 無需手動輸入枚舉成員的陣列。相反,您可以使用System.Enum.GetValues(typeof(ReadAccess))此外,而不是匿名類型列表中,您可以使用列表從字典(詞典不被接受作爲數據源):

ReadDataGridViewComboBoxColumn.DataSource= System.Enum.GetValues(typeof(ReadAccess)) 
    .Cast<Enum>.ToDictionary<string, Enum>((e) => e.ToString(), (e) => e).ToList; 

或直接在KeyValuePair列表

ReadDataGridViewComboBoxColumn.DataSource = System.Enum.GetValues(typeof(ReadAccess)) 
    .Cast<Enum>.Select((value) => new KeyValuePair<string, enum>(value.ToString(), (value))); 

仍然有必要(但DisplayMember現在是「密鑰」):

ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 
ReadDataGridViewComboBoxColumn.ValueMember = "Value"; 
ReadDataGridViewComboBoxColumn.DisplayMember = "Key";