2016-02-06 5 views
0

Я пытаюсь создать небольшую контактную книгу, которая берет информацию о контактах из базы данных mssql. У нее есть 3 таблицы: контакты, last_talk (последний раз я разговаривал с контактом + краткое описание обсуждение) и другая таблица (которая имеет как первичные ключи из первых двух таблиц)C# отображает строку из базы данных sql

На форме (вкладке tabcontrol), где я показываю контакты, я добавил 2 списка, один загружает и отображает имена контактов, а второй список загружает список «Последний разговор» для каждого контакта, который я выбираю, в зависимости от того, сколько «переговоров» у меня было с контактом.

Теперь я пытаюсь отобразить внутри label.Text и внутри richTextBox.Text из моей базы данных, когда я выбираю поле в моем списке «Список разговоров» ListBox.

В моей базе данных есть 3 таблицы: 1 для контактов, 1 для обсуждений/переговоров, 1 для создания отношения между двумя первыми таблицами.

Вот часть кода:

private void PopulateSelectedTalk() 
    { 
     string query = "SELECT * FROM LastTalk WHERE Id = @ID"; 

     using (connection = new SqlConnection(connectionString)) 
     using (SqlCommand command = new SqlCommand(query, connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.Add("@ID", SqlDbType.Int); 
      command.Parameters["@ID"].Value = lstConversationList.SelectedValue; 


      connection.Open(); 
      SqlDataReader rdr = command.ExecuteReader(); 

      while (rdr.Read()) 
      { 
       lblLastTalk.Text = rdr["LastTalkSubject"].ToString(); 
       rtxtLastTalkDescription.Text = rdr["LastTalkDescription"].ToString(); 

      } 
      rdr.Close(); 
      connection.Close(); 

     } 
    } 
    private void lstConversationList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     PopulateSelectedTalk(); 
    } 

У меня была очень похожая проблема, что я разместил здесь: C# Displaying a sql database object's name in a label.Text property on "SelectedIndexChanged" Event

И после того, как я добавил

command.Parameters.Add("@ID", SqlDbType.Int); 
     command.Parameters["@ID"].Value = lstConversationList.SelectedValue; 

он работал.

Однако теперь, когда я пытаюсь использовать lstConversationList.SelectedValue; я получаю следующее исключение

Исключение типа «System.InvalidCastException» произошло в System.Data.dll, но не был обработан в пользовательском коде Дополнительная информация: Не удалось преобразовать значение параметра из DataRowView к Int32.

Исключение выбрано этой строкой: SqlDataReader rdr = command.ExecuteReader();

Когда я наводил указатель мыши на «Listbox.SelectedValue» в режиме отладки в предыдущей проблеме, я получаю значение «1», когда я наводил курсор на «Listbox.SelectedValue» в коде i, вышедшем выше i получить «System.DataRowView»

Вот код из предыдущего вопроса (он работает):

private void PopulateContactLabels() 
    { 
     string query = "SELECT * FROM Contact WHERE Id = @ID"; 

     using (connection = new SqlConnection(connectionString)) 
     using (SqlCommand command = new SqlCommand(query, connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.Add("@ID", SqlDbType.Int); 
      command.Parameters["@ID"].Value = lstContactList.SelectedValue; 

      connection.Open(); 
      SqlDataReader rdr = command.ExecuteReader(); 

      while (rdr.Read()) 
      { 
       lblContactName.Text = rdr["Name"].ToString(); 
       lblCompany.Text = rdr["Company"].ToString(); 
       lblOccupation.Text = rdr["Occupation"].ToString(); 
       lblPhoneNumber.Text = rdr["PhoneNumber"].ToString(); 
       lblEmail.Text = rdr["Email"].ToString(); 
      } 
      rdr.Close(); 
      connection.Close(); 

     } 
    } 

Что я упускаю/делаю неправильно? Пожалуйста, помогите!

Edit: Код, который задает элементы в lstConversationlist

private void PopulateTalkList() 
    { 
     string query = "SELECT a.LastTalkSubject FROM LastTalk a " + "INNER JOIN ContactLastTalk b ON a.Id = b.LastTalkId " + 
      "WHERE b.ContactId = @ContactId"; 

     using (connection = new SqlConnection(connectionString)) 
     using(SqlCommand command = new SqlCommand(query,connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.AddWithValue("@ContactId", lstContactList.SelectedValue); 
      DataTable lastTalkTable = new DataTable(); 
      adapter.Fill(lastTalkTable); 

      lstConversationList.DisplayMember = "LastTalkSubject"; 
      lstConversationList.ValueMember = "Id"; 
      lstConversationList.DataSource = lastTalkTable; 
     } 
    } 
+0

Не могли бы вы показать код, который задает элементы в _lstConversationList_? – Steve

+0

Я добавил код. – Cristian

ответ

0

Проблема возникает из-за того, что вы установите DataSource из lstConversationList в DataTable и забудьте установить его свойство ValueMember имя столбца, содержащего значение для извлечения из свойства SelectedValue.

Когда вы устанавливаете свойство DataSource в DataTable, каждый элемент в коллекции ListBox.Items является DataRowView.Если вы не задаете свойство ValueMember, то SelectedValue не имеет способа узнать, из какого столбца следует его возвращаемое значение. Он просто возвращает весь экземпляр DataRowView и, конечно же, это не целое число, которое вы ищете.

Итак, когда вы заполните lstConversationList не забудьте написать

private void PopulateTalkList() 
{ 

    ' NOTE. you need to add also the ID field to the select query 

    string query = @"SELECT a.Id, a.LastTalkSubject 
        FROM LastTalk a INNER JOIN ContactLastTalk b 
        ON a.Id = b.LastTalkId 
        WHERE b.ContactId = @ContactId"; 

    using (connection = new SqlConnection(connectionString)) 
    using(SqlCommand command = new SqlCommand(query,connection)) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
    { 
     command.Parameters.AddWithValue("@ContactId", lstContactList.SelectedValue); 
     DataTable lastTalkTable = new DataTable(); 
     adapter.Fill(lastTalkTable); 

     lstConversationList.DisplayMember = "LastTalkSubject"; 
     lstConversationList.ValueMember = "Id"; 
     lstConversationList.DataSource = lastTalkTable; 
    } 
} 
+0

Я использую DataTable в методе, который отображается в списке «Список бесед» ListBox, где я показываю разговоры, которые у меня были с выбранным контактом (в моем списке контактов ListBox). – Cristian

+0

с использованием (SqlDataAdapter adapter = new SqlDataAdapter (команда)) { command.Parameters.AddWithValue ("@ ContactId", lstContactList.SelectedValue); DataTable lastTalkTable = new DataTable(); adapter.Fill (lastTalkTable); lstConversationList.DisplayMember = "LastTalkSubject"; lstConversationList.ValueMember = "Id"; lstConversationList.DataSource = lastTalkTable; } – Cristian

+0

Должен ли я делиться таблицами данных между методами? или я должен использовать другой в моем PopulateSelectedTalk(); метод? – Cristian

0

значение должно быть строкой, так что вещь будет

lstConversationList.SelectedValue.toString(); 
+0

дайте мне знать, если это сработает. ОК? –

+0

Извините, но это не работает. – Cristian

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