列表框选定值问题

时间:2012-02-08 16:19:44

标签: c# .net sql winforms listbox

我的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";
    }

因此,虽然列表框显示客户端名称,但选中时应返回的值是数字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;

播放无效。据我所知,列表框仍然返回客户端名称,而它应该返回数字clientID(int)。

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

你的代码应该工作 - 只是测试了。 确保您绑定的数据是正确的 - 尤其是ClientID 还要确保在转换为int之前选择了值

希望有所帮助

答案 1 :(得分:1)

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

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

希望这有帮助。

答案 2 :(得分:0)

最后我必须这样做:

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

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

答案 3 :(得分: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;
  }
}

答案 4 :(得分:0)

我遇到了同样的问题,但现在通过这个问题解决了这个问题

替换此

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

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

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

原因是在@Sebastian回答中解释了这一点。