我确实尝试先找到其他答案 - 我发现这个(Items on ListBox show up as a class name)帖子类似但没有完全回答......
无论如何,我有一个列表框,由于某种原因,它将类名填充为选定的值,但只有当它第一次进行加载时(我在调试中执行了一步,并调用selectedindex时更改)列表被填充。值是正确的,以及显示名称,但它取对象ToString()。我不想覆盖backDatePosting类中的ToString()方法,除非有办法区分两者字段(即两者都是字符串,我需要它们相应地返回)
backDatePosting类对象
public class backDatePosting
{
private readonly string _matnum;
private readonly string _dtCode;
public string MatNum
{
get
{
return _matnum;
}
}
public string DateCode
{
get
{
return _dtCode;
}
}
public backDatePosting(string _matnum, string _dtCode)
{
this._matnum = _matnum;
this._dtCode = _dtCode;
}
}
然后我的表格
public Form1()
{
......
refreshBackDatePosting();
}
void refreshBackDatePosting()
{
DataTable dt;
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("sample conn string");
using (conn)
{
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("development_usp_getBackDatePosting", conn);
cmd.CommandType = CommandType.StoredProcedure;
using(cmd)
{
dt = new DataTable();
conn.Open();
System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
dt.Load(dr);
conn.Close();
}
}
List<backDatePosting> lst = new List<backDatePosting>();
for (int i = 0; i < dt.Rows.Count; i++ )
{
lst.Add(new backDatePosting(dt.Rows[i][0].ToString().Trim(), dt.Rows[i][1].ToString().Trim()));
}
this.lst_BackDatePosting.DataSource = lst;
this.lst_BackDatePosting.DisplayMember = "MatNum";
this.lst_BackDatePosting.ValueMember = "DateCode";
}
和选定的索引更改事件
void lst_BackDatePosting_SelectedIndexChanged(object sender, System.EventArgs e)
{
txt_BackDate_DateCode.Text = lst_BackDatePosting.SelectedValue.ToString();
//throw new System.NotImplementedException();
}
我错过了什么?
答案 0 :(得分:4)
这里的问题是您在设置绑定信息(DisplayMember和ValueMember)之前设置了DataSource。即使SelectedIndexChanged事件触发,此时SelectedValue也是整个backDatePosting对象,这就是你得到[Namespace] .backDatePosting字符串的原因。有两种方法可以解决这个问题:
1)在DataSource之前声明你的绑定:
this.lst_BackDatePosting.DisplayMember = "MatNum";
this.lst_BackDatePosting.ValueMember = "DateCode";
this.lst_BackDatePosting.DataSource = lst; // Now follows the binding
2)设置一个绕过SelectedIndexChanged事件的新绑定,而不是使用实际的SelectedValue:
txt_BackDate_DateCode.DataBindings.Add(new Binding("Text", lst_BackDatePosting, "SelectedValue"));