Выпуск списка выбранных значений - PullRequest
1 голос
/ 08 февраля 2012

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

 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 ]

2 голосов
/ 08 февраля 2012

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

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

1 голос
/ 08 февраля 2012

lbxClient.SelectedValue является строкой. Он должен быть преобразован в int следующим образом:

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

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

0 голосов
/ 14 января 2013

У меня была та же проблема, но теперь она решена с помощью этого

Замените это

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

на

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

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

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

0 голосов
/ 09 февраля 2012

Ваш код должен работать, однако вы должны поместить проверку работоспособности на 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 голосов
/ 09 февраля 2012

В итоге мне пришлось сделать это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...