3

クラスに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を印刷名として入力したいと思います。

問題は、リストの最後の項目だけがコンボボックスに出力されることです。何が間違っているのでしょうか。

4

1 に答える 1

4

での表示に使用DisplayMemberするフィールドを指定するために使用しますComboBox。リストの新しいインスタンスを決して再作成しないことを保証してください
accessList readonlyあなたがそれをしなかった場合、あなたが再授与するたびにreadonly再割り当てしないと、これは微妙なバグをもたらすかもしれません。DataSourceaccessList

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;
}
于 2011-05-28T20:55:50.583 に答える