【问题标题】:Listbox Selected Value Issue列表框选定值问题
【发布时间】:2012-03-01 02:53:49
【问题描述】:

我的 WinForms 应用程序中有一个列表框,其中填充了以下 C# 中的 SQL 代码:

 private void PopulateClients()
    {
        string sqlText = "SELECT ClientID, ClientName FROM tblClients;";
        cSqlQuery cS = new cSqlQuery(sqlText, "table");
        lbxClient.DataSource = cS.cTableResults;
        lbxClient.DisplayMember = "ClientName";
        lbxClient.ValueMember = "ClientID";
    }

因此,当列表框显示客户端名称时,它应在选择时返回的值是数字客户端 ID。

不过,在后面的代码中——

 private void btnAddNewJob_Click(object sender, EventArgs e)
    {
        try
        {
            string strNewJobName = txtNewJobName.Text;
            string strNewJobRef = txtNewJobRef.Text;
            int intNewJobClient = (int)lbxClient.SelectedValue;
            string sqlText = "INSERT INTO tblJobs (JobID, JobClient, JobRef, JobName) " +
                             "VALUES (@JobID, @JobClient, @JobRef, @JobName);";
            SqlCommand sqlCom = new SqlCommand(sqlText);
            sqlCom.Parameters.Add("@JobID", SqlDbType.Int);
            sqlCom.Parameters.Add("@JobClient", SqlDbType.Int);
            sqlCom.Parameters.Add("@JobRef", SqlDbType.Text);
            sqlCom.Parameters.Add("@JobName", SqlDbType.Text);
            cConnectionString cS = new cConnectionString();
            sqlCom.Parameters["@JobID"].Value = cS.NextID("JobID", "tblJobs");
            sqlCom.Parameters["@JobClient"].Value = intNewJobClient;
            sqlCom.Parameters["@JobRef"].Value = strNewJobRef;
            sqlCom.Parameters["@JobName"].Value = strNewJobName;
            cSqlQuery cQ = new cSqlQuery(sqlCom, "non query");
            PopulateJobs();
            txtNewJobName.Text = "";
            txtNewJobRef.Text = "";
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

第三行失败

int intNewJobClient = (int)lbxClient.SelectedValue;

使用无效的演员表。据我所见,列表框仍在返回客户端名称,而它应该返回数字客户端 ID (int)。

有什么想法吗?

【问题讨论】:

  • 可能在你指出的那一行,SelectedValue 属性返回 null 不能转换为 int..

标签: c# .net sql winforms listbox


【解决方案1】:

您的代码应该可以工作 - 刚刚测试过。 确保您绑定的数据是正确的 - 特别是 ClientID 还要确保在转换为 int 之前选择了该值

希望对你有帮助

【讨论】:

    【解决方案2】:

    lbxClient.SelectedValue 是一个字符串。它应该像这样转换为 int:

    int intNewJobClient = Convert.ToInt32(lbxClient.SelectedValue);
    

    希望这会有所帮助。

    【讨论】:

    • 你应该确保在转换之前 SelectedValue 不为空,以防没有选择
    • SelectedValue 是一个对象,而不是一个字符串。否则,是的,这应该有效,除非“ClientID”不是真正的整数。
    【解决方案3】:

    最后我不得不这样做:

    int intClient = 0;
            try
            {
                intClient = (int)lbxClient.SelectedValue;
            }
            catch (Exception)
            {
                intClient = 0;
            }
    

    我觉得这有点软糖 - 但它有效!

    【讨论】:

      【解决方案4】:

      您的代码应该可以工作,但是您应该对索引上的 SelectedValue 进行健全性检查。

      if (lbxClient.SelectedIndex != -1)
      {
        int intClient = 0;
        try
        {
           intClient = Convert.ToInt32(lbxClient.SelectedValue);
        }
        catch (Exception)
        {
            // catch if the value isn't integer.
            intClient = -1;
        }
      }
      

      【讨论】:

        【解决方案5】:

        我有同样的问题,但现在通过这样做解决了

        替换这个

        lbxClient.DataSource = cS.cTableResults;
        lbxClient.DisplayMember = "ClientName";
        lbxClient.ValueMember = "ClientID";
        

        lbxClient.DisplayMember = "ClientName";
        lbxClient.ValueMember = "ClientID";
        lbxClient.DataSource = cS.cTableResults;
        

        只需将第一行 "DataSource=" 放在最后,您将摆脱它:)

        @Sebastian 回答中解释了这样做的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-02
          • 2011-08-09
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          相关资源
          最近更新 更多