2011-03-18 78 views
10

嗨,我可以知道如何獲得下面的枚舉值綁定到組合框? 我寫了下面的代碼,它的效果很好,但奇怪是最好的方法。添加枚舉到組合框

public enum CourseStudentStatus 
{ 
    Active = 1, 
    Completed = 2, 
    TempStopped = 3, 
    Stopped = 4, 
} 

//Bind Course Status 
Dictionary<string, int> list = new Dictionary<string, int>(); 
foreach (int enumValue in Enum.GetValues(typeof(CourseStudentStatus))) 
    list.Add(Enum.GetName(typeof(CourseStudentStatus), enumValue), enumValue); 
var column = ((DataGridViewComboBoxColumn)dgv.Columns["studentCourseStatus"]); 
column.DataPropertyName = "StudentStatus";    
column.DisplayMember = "Key"; 
column.ValueMember = "Value"; 
column.DataSource= list.ToList(); 

-----------------更新-------------------
嗨,我根據Sanjeevakumar Hiremat已經將我的代碼更改爲此,並且它完美地工作。

cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));

然而,當我要一個Get()和想要的值綁定回cbStatus,它鑄錯誤{「對象引用不設置爲一個對象的一個​​實例。」}
cbStatus.SelectedValue = Course.Status;

的cbStatus.Datasource不是空的,它的價值後綁定到cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));

請指點。

+0

我在想這是否有可能減少這段垃圾代碼?或者這可以轉換爲一個函數? – VeecoTech 2011-03-18 10:35:49

+0

你可以把你的轉換爲一個字典轉換爲System.Enum的擴展方法,這將使你的代碼更具可讀性和通用性,但我不認爲有一種方法可以綁定到一個枚舉而不需要完成所有的GetValues和GetName東東。 – 2011-03-18 10:52:32

回答

4

我不認爲有最好的辦法。我曾經做過類似GenericListItem<T>類的工作,其中T是後備值,在你的情況下是一個枚舉。

此類暴露Display字符串和Value要綁定的T屬性。我想我也覆蓋了ToString,因爲如果你不指定DisplayMember它是默認值。我進一步做了一個構造函數,只需要Value和默認DisplayValue.ToString,在枚舉的情況下,我認爲。

我然後作出List<GenericListItem<T>>,喂進該塔的DataSource和在代碼相應地設置DisplayMemberValueMember性質。該列表是您示例中使用的字典的替代方案。

但我並不是說這是一個更好的解決方案:-)但是它意味着您可以將代碼(比如枚舉迭代)移入此類中,或者專門用於更好地處理某些數據類型的類,所有的最終目標都是插入到列表中並綁定到控件。

+0

你能告訴你將DisplayMember和ValueMember設置爲了什麼嗎? – 2014-01-11 22:51:20

+1

@kirsteng'Display'屬性是'DisplayMember','Value'屬性是'ValueMember'。我的類是通用的,所以你還必須提供一種方法來獲取任何值的字符串表示。你可以用'Func '或者其他的東西來做到這一點。 – 2014-01-12 08:55:42

17

以下應該是綁定它的最簡單方法。

column.DataSource = Enum.GetValues(typeof(CourseStudentStatus)); 

要獲得選定的值,您需要將其轉換爲枚舉類型。

CourseStudentStatus selectedValue = (CourseStudentStatus)column.SelectedValue 

Enum.GetValues返回enumType值的數組,然後可以綁定到任何控件。

我已經測試過這個獨立的組合框,而不是DataGridView,YMMV中的組合框列。

+0

在DataGridView中應該沒問題 - 公開的綁定屬性相同。 – 2011-03-18 11:03:16

+0

@Sanjeevakumar Hiremath:Get()後我如何綁定回組合框。 cbRole.SelectedValue = user.RoleId; // Get()之後 – VeecoTech 2011-03-18 14:07:14

+0

我應該設置的displaymember和valuemember是什麼? – VeecoTech 2011-03-18 14:08:49