Winforms列表框项目的幕后属性

时间:2014-07-25 12:48:03

标签: c# winforms listbox

所以我回去清理多年前做过的代码。在一个部分中,(我使用过几次)我有一个显示员工姓名的列表框,例如

史密斯,约翰 Doe,Jane

当用户点击名称时,我会执行类似

的操作
String unBrokenName = ListBox1.SelectedItem.ToString();
String LastName = unBrokenName.Substring(...

你明白了,我根据","提取名字和姓氏。 然后我这样做是为了从sql数据库中获取员工。

Employee SelectedEmployee = Employee.GetEmployeeByFirstLast(FirstName, LastName);

当时,这是我所知道的最好的。现在感觉不对,因为我知道我应该能够在选择员工时获得员工的sql ID,例如

int EmployeeId = SOMELISTBOXSELECTEDITEMPROPERTY;
Employee SelectedEmployee = Employee.GetEmployeeByID(EmployeeId);

列表框项目是否有一些属性可以存储此ID,同时显示用户习惯看到的相同名称?

2 个答案:

答案 0 :(得分:3)

您实际上可以在列表框中添加任何内容:

class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return this.Name;
    }
}

然后:

listBox1.Items.Add( new Foo() { Id = 101, Name = "Foo Bar" } );
listBox1.Items.Add( new Foo() { Id = 102, Name = "Foo Bar Jr." } );

SelectedItem属性现在将为您提供所选的Foo,同时在列表中显示Name属性。

private void listBox1_SelectedIndexChanged( object sender, EventArgs e )
{
    Foo item = ( listBox1.SelectedItem as Foo );
    if( item != null )
    {
        // use item.Id here
    }
}

您也可以使用列表框的ToString属性来选择列表框将显示的属性,而不是覆盖DisplayMember

答案 1 :(得分:2)

您可以这样做:

listBox1.DataSource = employeesList;
listBox1.DisplayMember = "LastName";
listBox1.ValueMember = "EmployeeId";

当您运行应用程序时,列表框将包含您要传递的员工列表,它将显示LastName。但是当您选择一个项目时,您可以通过以下方式访问该标识:

`listBox1.SelectedValue();`

然后在listbox1_Click事件中,例如:

if (listBox1.SelectedIndex != -1)
{
    int employeeId = listBox1.SelectedValue();
    //do something here;       
}