第一次调用SelectedIndex时,Listbox SelectedValue错误

本文关键字:Listbox SelectedValue 错误 调用 SelectedIndex 第一次 | 更新日期: 2023-09-27 18:06:11

我确实试着先找到其他答案-我发现这个(列表框上的项目显示为类名)帖子是相似的,但没有确切地回答…

无论如何,我有一个列表框,由于某种原因,它正在填充类名作为所选值,但只有当它第一次加载时(我在调试中进行了一步执行),当列表被填充时,它调用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;
    }
}

然后是form

    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();
    }

我错过了什么?

第一次调用SelectedIndex时,Listbox SelectedValue错误

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

1)在数据源之前声明绑定:

    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"));