c# - BindingList 与我的类使用它的属性填充 ComboBox?

标签 c# winforms .net-3.5 combobox bindinglist

我的类有一个 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>();

在加载表单时,我将其分配给组合框:

myComboBox.DataSource = accessList;

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

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

最佳答案

使用 DisplayMember 指定要在 ComboBox 中显示的字段。
使 accessList readonly 以保证您永远不会重新创建列表的新实例。如果您不将其设置为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")并查看反射(reflect)在 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;
}

关于c# - BindingList 与我的类使用它的属性填充 ComboBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6164264/

相关文章:

c# - 扩展结构的最简单方法(PointF)

C# 处理 CSV 文件

c# - 查找具有数百万个元素的两个列表或哈希集之间的公共(public)元素数

C# 应用程序在开发机器上运行,在非开发机器上失败

c# - 如何有效地终止 C# 中的线程?

c# - HttpWebRequest 没有关闭方法?

c# - 如何替换前导空格但保留多行?

c#, Textbox.Text 编码

c# - 如何在 WinForms 中绘制图像反射?

c# - 使用反射来指定委托(delegate)的类型(附加到事件)?