gpt4 book ai didi

c# - SelectedIndex 第一次调用时列表框 SelectedValue 错误

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:21 26 4
gpt4 key购买 nike

我确实先尝试寻找其他答案 - 我发现这个 ( Items on ListBox show up as a class name) 帖子很相似,但没有准确回答......

无论如何,我有一个列表框,出于某种原因,它将类名填充为选定值,但只有在它第一次加载时(我确实在调试中逐步完成,它调用 selectedindex changed when列表被填充。值是正确的,显示名称也是正确的,但它需要对象 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();
}

我错过了什么?

最佳答案

这里的问题是您在设置绑定(bind)信息(DisplayMember 和 ValueMember)之前设置了数据源。即使 SelectedIndexChanged 事件触发,此时 SelectedValue 是整个 backDatePosting 对象,这就是您获得 [Namespace].backDatePosting 字符串的原因。有两种方法可以解决此问题:

1) 在您的数据源之前声明您的绑定(bind):

    this.lst_BackDatePosting.DisplayMember = "MatNum";
this.lst_BackDatePosting.ValueMember = "DateCode";
this.lst_BackDatePosting.DataSource = lst; // Now follows the binding

2) 设置绕过 SelectedIndexChanged 事件并使用实际 SelectedValue 的新绑定(bind):

    txt_BackDate_DateCode.DataBindings.Add(new Binding("Text", lst_BackDatePosting, "SelectedValue"));

关于c# - SelectedIndex 第一次调用时列表框 SelectedValue 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998415/

26 4 0
文章推荐: python - 列表推导式创建成对差异
文章推荐: c# - 比较泛型 : A "master-type" IEnumerable<> that is generic, 但匹配所有特定类型(IEnumerable、IEnumerable、...)?