gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:38:17 24 4
gpt4 key购买 nike

我的类有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com