所以我回去清理多年前做过的代码。在一个部分中,(我使用过几次)我有一个显示员工姓名的列表框,例如
史密斯,约翰 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,同时显示用户习惯看到的相同名称?
答案 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;
}