2011-05-28 74 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