C# 列表框选定值问题

C# 列表框选定值问题,c#,.net,sql,winforms,listbox,C#,.net,Sql,Winforms,Listbox,我的WinForms应用程序上有一个列表框,其中填充了以下C#中的SQL代码: 因此,当列表框显示客户端名称时,选中时它应该返回的值是数字clientID 但是,在代码的后面- private void btnAddNewJob_Click(object sender, EventArgs e) { try { string strNewJobName = txtNewJobName.Text; strin

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

因此,当列表框显示客户端名称时,选中时它应该返回的值是数字clientID

但是,在代码的后面-

 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;
用无效的演员阵容。就我所见,listbox仍然返回客户机名称,而它应该返回数字clientID(int)


有什么想法吗?

lbxClient.SelectedValue是一个字符串。应将其转换为int,如下所示:

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

希望这能有所帮助。

您的代码应该可以工作-刚刚测试过。 确保绑定到的数据是正确的,尤其是ClientID 另外,请确保在强制转换为int之前选择了该值


希望能有所帮助

最后我不得不这样做:

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

我觉得这有点像是胡说八道,但它确实管用

您的代码应该可以工作,但是您应该对索引上的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;
  }
}

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

替换这个

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

只需将第一行
“DataSource=“
放在最后一行,您就可以摆脱它:)


原因在@Sebastian answer中解释。

如果未选择任何内容,则在强制转换之前,您应该确保SelectedValue不为空。
SelectedValue
是一个对象,而不是字符串。否则,可以,除非“ClientID”不是真正的整数。可能在您指示的行中,
SelectedValue
属性返回null,不能转换为int。。
lbxClient.DataSource = cS.cTableResults;
lbxClient.DisplayMember = "ClientName";
lbxClient.ValueMember = "ClientID";
lbxClient.DisplayMember = "ClientName";
lbxClient.ValueMember = "ClientID";
lbxClient.DataSource = cS.cTableResults;