2011-05-28 73 views
2

我有一個BindingList與我的類,我想填充一個ComboBox使用它的屬性,所以當我的列表更改組合框也會改變。BindingList與我的類使用它的屬性填充組合框?

public class UserAccess 
{ 
    public override string ToString() 
    { 
     return Access; 
    } 
    public int AccessId { get; set; } 
    public string Access { get; set; } 
    public List<string> Command = new List<string>(); 

    public bool HasCommand(string cmd) 
    { 
     return this.Command.Any(x => x == cmd); 
    } 
} 

public BindingList<UserAccess> accessList = new BindingList<UserAccess>(); 

在我的窗體加載我把它分配給組合框:

myComboBox.DataSource = accessList; 

我想填充訪問或與ACCESSID的價值和訪問作爲印刷名稱框。

問題是它只會將列表的最後一項打印到組合框中我做錯了什麼?

回答

3

使用DisplayMember指定要在ComboBox中顯示的字段。
使accessListreadonly保證你永遠不會重新創建列表的新實例。如果你不這樣做readonly,這可能會引入一個微妙的錯誤,如果你不重新指定DataSource,只要你recereate accessList

private readonly BindingList<UserAccess> accessList = new BindingList<UserAccess>(); 

public Form1() 
{ 
    InitializeComponent(); 

    comboBox1.ValueMember = "AccessId"; 
    comboBox1.DisplayMember = "Access"; 
    comboBox1.DataSource = accessList; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    accessList.Add(new UserAccess { AccessId = 1, Access = "Test1" }); 
    accessList.Add(new UserAccess { AccessId = 2, Access = "Test2" }); 
} 

如果您需要能夠在accesslist中更改項目性質(如accessList[0].Access = "Test3"),看看體現在UI的變化,你需要實現INotifyPropertyChanged

例如:

public class UserAccess : INotifyPropertyChanged 
{ 
    public int AccessId { get; set; } 

    private string access; 

    public string Access 
    { 
     get 
     { 
      return access; 
     } 

     set 
     { 
      access = value; 
      RaisePropertyChanged("Access"); 
     } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     var temp = PropertyChanged; 
     if (temp != null) 
      temp(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

感謝它就像一個魅力,並沒有意識到不使用只讀這是很好的瞭解這個問題。是否也可以創建組合框的第一個條目,默認分配爲-1或0而不將其添加到列表中? – Guapo 2011-05-28 21:22:14

+0

如果您使用數據源,則需要將列表中的額外項目保留爲默認值-1。 – 2011-05-28 21:23:59

+0

所以我仍然需要將它添加到列表項中,我不能以某種方式將它直接添加到數據源之前的列表中?例如,我想讓第一個項目名爲Select:它不能被選擇告訴他必須選擇訪問權限的人,因此他們不會僅使用默認訪問權限創建用戶。 – Guapo 2011-05-28 21:33:15