2015-10-03 3 views
0

У меня есть checkListBox в моем приложении для формы Windows и привязан к данным моей базы данных с SQL. Я заполняю список элементов в соответствии с тем, что я выбираю из своего comboBox. Если я выберу элемент 1 из своего comboBox, он отобразит имя клиента, использующего этот элемент. Я хочу получить идентификатор клиентов в соответствии с тем, что я проверяю в своем checkListBox.Как получить идентификатор элемента в CheckListBox

Вот как я заполняю моего COMBOBOX

private void fill_comboBox() 
     { 
      myConn = new SqlConnection("Server = localhost; Initial Catalog= dbName; Trusted_Connection = True"); 
      try 
      { 
       string query = "select itemId, itemName from item_detail"; 
       SqlDataAdapter da = new SqlDataAdapter(); 
       myConn.Open(); 
       DataTable dt = new DataTable(); 

       SqlCommand command = new SqlCommand(query, myConn); 

       SqlDataReader reader = command.ExecuteReader(); 

       dt.Load(reader); 

       DataRow dr; 
       dr= dt.NewRow(); 
       dr.ItemArray = new object[] { 0, "<----------Select an item-------> " }; 
       dt.Rows.InsertAt(dr, 0); 

       itemComboBox.DataSource = dr; 
       itemComboBox.ValueMember = "itemId"; 
       itemComboBox.DisplayMember = "itemName"; 

       fill_customerCheckListBox(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

Вот как я заполняю мой checkListBox

private void fill_customerCheckListBox() 
{ 
    myConn = new SqlConnection("Server = localhost; Initial Catalog= dbName; Trusted_Connection = True"); 

    try 
    { 
     myConn.Open(); 

     DataSet myDataSet = new DataSet(); 
     myDataSet.CaseSensitive = true; 

     string commandString = "select fullName from[customer_detail] as cd LEFT JOIN[item_customer] as ic ON ic.customerId= cd.customerI WHERE ic.itemId= '" + itemCombBox.SelectedValue + "' "; 

     myCommand = new SqlCommand(); 

     myCommand.Connection = myConn; 

     myCommand.CommandText = commandString; 

     SqlDataAdapter myDataAdapter = new SqlDataAdapter(); 

     myDataAdapter.SelectCommand = myCommand; 

     myDataAdapter.TableMappings.Add("Table", "customer_detail"); 

     myDataAdapter.Fill(myDataSet); 

     DataTable myDataTable = myDataSet.Tables[0]; 

     customerCB.Items.Clear(); 

     string s = "Select All Customer"; 

     customer.Items.Add(s); 

     foreach (DataRow dataRow in myDataTable.Rows) 
     { 

      customerCB.Items.Add(dataRow["fullName"]); 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

У меня есть praremter цикла, который пытается перебрать каждый проверяемый элемент от моего клиентаCB, но это не работает. Когда я вхожу в режим отладки, код DataRow row = (itemChecked as DataRowView).Row; вызывает исключение

Ссылка на объект не установлена ​​в экземпляр объекта.

Я понятия не имею, как это исправить. Помощь будет признателен, спасибо

string parameterList = ""; 



foreach (object itemChecked in customerCB.CheckedItems) 
{ 
    DataRow row = (itemChecked as DataRowView).Row; 
    parameterList += (parameterList.Length == 0) ? row[0].ToString() : ", " + row[0].ToString(); 
} 
+0

что 'customerCB'? Что такое член ValueMember и DIsplay? Это WinForm или WPF? –

+0

@alekkowalczyk вы действительно вообще прочитали мой вопрос? – RedRocket

+0

Вы не устанавливаете значение ["fullName"] как фактический элемент? Как вы можете ожидать, что itemChecked будет иметь полную строку? – zaitsman

ответ

1

Попробуйте следующий способ!

foreach(object itemChecked in checkedListBox1.CheckedItems) 
    { 
     DataRowView castedItem = itemChecked as DataRowView; 
     string fullName= castedItem["fullName"]; 

    } 

(OR) Вы должны были бы отбрасывать или разобрать элементы их строго типизированных эквивалентов, или использовать System.Data.DataSetExtensions пространство имен для использования DataRowExtensions.Field method показано ниже:

foreach (var item in checkedListBox1.CheckedItems) 
{ 
    var row = (itemChecked as DataRowView).Row; 
    int id = row.Field<int>("ID"); 
    string name = row.Field<string>("fullName"); 

} 
+0

Я пробовал оба ваш метод, это в конечном итоге те же исключения. второй метод, когда отладчик запускает 'var row = (itemChecked as DataRowView) .Row; ' Он сразу же переходит к исключению. Он не может даже выполнить код под ним. – RedRocket

+0

Кроме того, первый, который он сказал, не может неявно преобразовывать объект типа в строку – RedRocket

+0

, а также я получаю castedItem как null – RedRocket

0

, кажется, чем когда вы заселение вашего выпадающего ваш вступаем dataRow["fullName"] поэтому этот литой DataRow row = (itemChecked as DataRowView).Row не будет работать, как только itemChecked содержит значение fullName, а не строки, попробуйте добавить dataRow.

+0

Что вы подразумеваете, добавляя dataRow? Можете ли вы привести пример? – RedRocket

+0

Измените это 'customerCB.Items.Add (dataRow [" fullName "]);' для 'customerCB.Items.Add (dataRow);' on' fill_customerCheckListBox' в сочетании с ответом @Webruster –

Смежные вопросы