我的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)。
有什么想法吗?
答案 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回答中解释了这一点。