C#: Как привязать к ListBox DisplayMember и ValueMember результат из метода класса?

Я пытаюсь создать ListBox, где у меня будет пара ключ-значение. Те данные, которые я получил от класса, который предоставляет их от получателей.

Учебный класс:

public class myClass
{
    private int key;
    private string value;

    public myClass() { }

    public int GetKey()
    {
        return this.key;
    }

    public int GetValue()
    {
        return this.value;
    }
}

Программа:

private List<myClass> myList;

public void Something()
{
    myList = new myList<myClass>();

    // code for fill myList

    this.myListBox.DataSource = myList;
    this.myListBox.DisplayMember = ??; // wanted something like myList.Items.GetValue()
    this.myListBox.ValueMember = ??; // wanted something like myList.Items.GetKey()
    this.myListBox.DataBind();
}

Это похоже на эту тему [ Невозможно сделать ключ-значение в списке в C# ], но мне нужно использовать класс, который возвращает значения из методов.

Можно ли сделать что-то простое, или мне лучше полностью переработать мой поток мыслей (и это решение)?

Спасибо за совет!

1 ответ

Решение

DisplayMember а также ValueMember свойства требуют имя (в виде строки) свойства, которое будет использоваться. Вы не можете использовать метод. Итак, у вас есть два варианта. Измените свой класс, чтобы он возвращал свойства, или создайте класс, производный от myClass, куда вы можете добавить два отсутствующих свойства

public class myClass2 : myClass
{

    public myClass2() { }

    public int MyKey
    {
        get{ return base.GetKey();}
        set{ base.SetKey(value);}
    }

    public string MyValue
    {
        get{return base.GetValue();}
        set{base.SetValue(value);}
    }
}

Теперь, когда вы внесли эти изменения, вы можете изменить свой список с помощью нового класса (но исправить инициализацию)

// Here you declare a list of myClass elements
private List<myClass2> myList;

public void Something()
{
    // Here you initialize a list of myClass elements
    myList = new List<myClass2>();

    // code for fill myList
    myList.Add(new myClass2() {MyKey = 1, MyValue = "Test"});

    myListBox.DataSource = myList;
    myListBox.DisplayMember = "MyKey"; // Just set the correct name of the properties 
    myListBox.ValueMember = "MyValue"; 
    this.myListBox.DataBind();         
}
Другие вопросы по тегам