【问题标题】:BindingList with my class populating a ComboBox using a property of it?BindingList 与我的类使用它的属性填充 ComboBox?
【发布时间】:2011-09-04 02:09:14
【问题描述】:

我的班级有一个 BindingList,我想使用它的属性填充 ComboBox,因此当我的列表更改时,ComboBox 也会更改。

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>();

在我的表单加载时,我将它分配给 ComboBox:

myComboBox.DataSource = accessList;

我想用 Access 或 AccessId 作为值和 Access 作为打印名称填充该框。

问题是它只会将列表的最后一项打印到组合框我做错了什么?

【问题讨论】:

    标签: c# winforms .net-3.5 combobox bindinglist


    【解决方案1】:

    使用DisplayMember 指定用于在ComboBox 中显示的字段。
    使accessListreadonly 保证您永远不会重新创建列表的新实例。如果你没有设置readonly,这可能会引入一个微妙的错误,如果你每次重新创建accessList时都没有重新分配DataSource

    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;
    }
    

    【讨论】:

    • 感谢它就像一个魅力,不知道不使用只读的问题,这很好知道。是否也可以创建组合框的第一个条目作为默认分配给 -1 或 0 而不将其添加到列表中?
    • 如果你使用 DataSource,你需要在你的列表中保持默认 -1 作为额外的项目。
    • 所以我仍然需要将它添加到列表项中我不能以某种方式将它直接添加到数据源之前的列表中?例如,我想将第一项设为名为 Select: 的项目:无法选择该项目来告诉该人他必须选择一个访问权限,这样他们就不会只创建一个具有默认访问权限的用户。
    • 这正是你应该做的。添加像accessList.Add(new UserAccess { AccessId = -1, Access = "Empty" }); 这样的行作为构造函数中的第一行之一。很难提出最简单的方法,因为您没有显示填充accessList 的代码。 `
    • 当我加载我的应用程序时,它会从我的 API 中获取一个 JSON,并且这个 JSON 被反序列化到列表中,从而创建它。所以我想我只会在从数据库中提取的 JSON 列表的开头添加 access -1 Select。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-09-18
    • 2013-12-19
    相关资源
    最近更新 更多