2012-02-08 2 views
1

У меня есть поле со списком в моем приложении WinForms, который населяет со следующим кодом SQL в C#:Listbox выбранного значения Issue

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

Так в то время как имена клиентов списка отображается, то его значение должен вернуться, когда выбран числовой идентификатор клиента.

Однако позже в коде -

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

вероятно, на линии, указанной вами, 'SelectedValue' свойство возвращает нуль, которые не могут быть приведены к междам .. – VS1

ответ

0

В конце концов, я должен был сделать это:

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

Что я чувствую, это немного придурок - но это работает!

1

lbxClient.SelectedValue - это строка. Он должен быть преобразован в int так:

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

Надеюсь, что это поможет.

+0

Не повез с этим я боюсь – PJW

+0

Вы должны убедиться, что SelectedValue не пустая перед заливкой , в случае, если ничего не выбрано. – Msonic

+0

'SelectedValue' - это объект, а не строка. В противном случае, да, это должно работать, если только «ClientID» не является целым числом. – LarsTech

2

Ваш код должен работать - это просто проверено. Убедитесь, что данные, которые вы связываясь с правильно - особенно ClientID также убедитесь, что значение выбрано перед заливкой в ​​целом

Надеется, что это помогает

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; 
    } 
} 
0

У меня была та же проблема, но ее решить сейчас, делая это

Заменить этот

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

С

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

Просто поместите первую строку "DataSource=" в прошлом и вы избавитесь от него :)

Причина объясняется в ответе @Sebastian.