我正在编写一个winforms应用程序,其中用户从列表框中选择一个项目并编辑构成关联对象一部分的一些数据.然后将编辑从对象列表应用到基础文件.
在ASP.Net中,为列表项分配不同的系统值而不是用户看到的显示文本是微不足道的.在winforms应用程序中,您必须将每个项目的"显示成员"和"有价值成员"设置为稍微复杂一些(而不是在互联网上相关)过程.
我已经这样做了.在调试模式中,我已经确认每个项目现在都有一个值,即显示成员(用户看到的"友好"字符串)和一个键值value,它将键保存到要更新数据的哈希表对象中存在.
因此,当用户选择一个字符串来编辑程序时,应该将"密钥"传递给哈希表,将对象拉出并允许在其上进行编辑.
抓到了吗?
我看不出任何明显的方式告诉程序查看项目的值成员.我天真地期望它填充列表框的"SelectedValue"属性,但到目前为止这太简单了.那我到底怎么去列表项值?
同时使用SelectedIndexChanged
和SelectedValueChanged
不起作用 - ListBox's
SelectedValue
属性始终为null.这也让我感到惊讶.
作为一种蹩脚的解决方法,您可以ListBox
使用以下方法直接将对象拉出直接SelectedIndex
:
public Form1() { InitializeComponent(); this.listBox1.DisplayMember = "Name"; this.listBox1.ValueMember = "ID"; this.listBox1.Items.Add(new Test(1, "A")); this.listBox1.Items.Add(new Test(2, "B")); this.listBox1.Items.Add(new Test(3, "C")); this.listBox1.Items.Add(new Test(4, "D")); this.listBox1.Items.Add(new Test(5, "E")); } private void OnSelectedIndexChanged(object sender, EventArgs e) { if(-1 != this.listBox1.SelectedIndex) { Test t = this.listBox1.Items[this.listBox1.SelectedIndex] as Test; if(null != t) { this.textBox1.Text = t.Name; } } }
(Test
只是一个有两个属性的简单类 - ID
和Name
).
似乎应该有一个更好的方法,但如果没有别的,这应该工作.
好的,所以答案来自Andy的回答,因此我的回答是正确的.
但是当我创建一个小类并试图将listitem强制转换为该类时,该程序抛出异常.
显而易见的异常告诉我程序无法将DictionaryEntry转换为我定义的类型.
所以我删除了代理类并重新定义了请求:
DictionaryEntry de = (DictionaryEntry)listbox.SelectedItem;
string htKey = de.Key.ToString();
这一切都很好.
最后简单的答案.感谢Andy的暗示.