2015-10-23 2 views
0

Я использую datagridview combobox для проблем и проблем с sub. При выборе проблем его подзадача combobox datasource заполняется по задаче. enter image description hereDatagridview combobox не обновляется

Для обновления к югу проблемы я использую

private void dataGridView2_CellValueChanged_1(object sender, DataGridViewCellEventArgs e) 
{ 
    try 
    { 
     if (e.ColumnIndex == dataGridView2.Columns[8].Index && e.RowIndex>-1) 
     { 
      DataGridViewComboBoxCell cell = dataGridView2.Rows[e.RowIndex].Cells[dataGridView2.Columns["KeyProblemDescription"].Index] as DataGridViewComboBoxCell; 
      if (cell == null) 
       return; 
      Guid primaryProblem = new Guid(dataGridView2.Rows[e.RowIndex].Cells[dataGridView2.Columns["PrimaryKeyProblem"].Index].Value.ToString()); 
      cell.DataSource = dbCalling.getPrimaryKeyProblemDescription(primaryProblem); 
      cell.DisplayMember = "Name"; 
      cell.ValueMember = "Id"; 
     } 
    } 
    catch (Exception) 
    { 
    } 
} 
public DataTable getPrimaryKeyProblemDescription(Guid keyProblem) 
     { 
      try 
      { 
       using (SqlCommand com = new SqlCommand(@"SELECT [Id] ,[KeyProblemDescription] as Name 
    FROM [KeyProblemDescription] where [PsfKeyProblemId][email protected] ")) 
       { 
        com.Parameters.AddWithValue("@keyProblem", keyProblem); 
        return selectDataTable(com); 
       } 
      } 
      catch (Exception e) 
      { 
       throw e; 
      } 
     } 


public DataTable selectDataTable(SqlCommand com) 
     { 
      try 
      { 
       DataTable datatable = new DataTable(); 
       using (SqlConnection con = new SqlConnection(connectionString)) 
       { 
        using (SqlDataAdapter sda = new SqlDataAdapter()) 
        { 
         com.Connection = con; 
         sda.SelectCommand = com; 
         con.Open(); 
         sda.Fill(datatable); 
         return datatable; 
        } 
       } 

      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

Its работает нормально, когда я сначала выбрать проблему, но в случае, когда я извлечение проблемы и суб проблемы из базы данных ее давая исключение DataGridView выпадающего значения проблемы саба не действительный. Причина этого заключается в том, что источник данных не зависит от проблемы. Как я могу избавиться от этого.

Редактировать

Когда я чуствую DataSource событие изменения значения ячейки обжигают для индекса строки -1 только, почему так ?? не для 1,2,3 .....

+0

что такое тип getPrimaryKeyProblemDescription? BindingList ? вы можете показать код getPrimaryKeyProblemDescription? – kain64b

+0

, пожалуйста, проверьте мои изменения .. –

+0

попытайтесь добавить обновление вручную: cell.DisplayMember = "Name"; cell.ValueMember = "Id"; cell.Items.Refresh(); – kain64b

ответ

0

Код выглядит в основном нормально, за исключением того, что ваш второй оператор if кажется неполным.

попробовать

if (cell == null) 
{ 
    return; 
} 
else 
{ 
    Guid primaryProblem = new Guid(dataGridView2.Rows[e.RowIndex].Cells[dataGridView2.Columns["PrimaryKeyProblem"].Index].Value.ToString()); 
    cell.DataSource = dbCalling.getPrimaryKeyProblemDescription(primaryProblem); 
    cell.DisplayMember = "Name"; 
    cell.ValueMember = "Id"; 
} 

Учитывая ваш второй if отсутствуют некоторые скобки, идентификатор ожидает, что вы уже получаете синтаксические ошибки

+1

Вам не нужно использовать скобки, если вы используете только 1 инструкцию. – Huntt

+1

И вам не нужно использовать 'else', так как если' cell' является 'null', он использует' return'. поэтому код не будет продолжаться. – Huntt

+1

Ага, я вижу. Меня учили всегда инкапсулировать - догадываться, что это не повредит, хотя я понимаю, что в этом случае мне не нужно, чтобы в этом случае – Takarii

0

Исключения Вашего получения кажется:

значение DataGridViewComboBoxCell является не действительны

В этом случае проблема заключается в том, что вы привязываетесь к новому списку значений, но выбранный идентификатор все еще не входит в этот новый список. Вы можете очистить текущее значение, установив cell.Value = null или напрямую настроив его на существующий новый идентификатор.

private void dataGridView2_CellValueChanged_1(object sender, DataGridViewCellEventArgs e) 
{ 
    try 
    { 
     if (e.ColumnIndex == dataGridView2.Columns[8].Index && e.RowIndex>-1) 
     { 
      DataGridViewComboBoxCell cell = dataGridView2.Rows[e.RowIndex].Cells[dataGridView2.Columns["KeyProblemDescription"].Index] as DataGridViewComboBoxCell; 
      if (cell == null) 
       return; 
      Guid primaryProblem = new Guid(dataGridView2.Rows[e.RowIndex].Cells[dataGridView2.Columns["PrimaryKeyProblem"].Index].Value.ToString()); 
      cell.Value = null; //added code 
      cell.DisplayMember = "Name"; 
      cell.ValueMember = "Id"; 
      cell.DataSource = dbCalling.getPrimaryKeyProblemDescription(primaryProblem); 
     } 
    } 
    catch (Exception) 
    { 
    } 
} 
0

Вы можете вместо этого генерировать отдельные значения combobox при срабатывании события редактирования ячейки datarow. Следующий код будет генерировать как родительский, так и дочерний, но вы можете просто автогенерировать дочерний элемент при редактировании и заполнить родительский объект другим методом и не изменять его каждый раз, когда он редактируется.

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) 
    { 

     // Parent Problem Combobox 
     if (e.ColumnIndex == x && e.RowIndex != -1) 
     { 
      DataGridViewComboBoxCell cbx = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[indexofparent]; 
      if (cbx?.Items != null) 
       cbx.Items.Clear(); 


      // Populate RESULT datatable from a SQL query 

      foreach (DataRow item in result.Rows) 
      { 
       if (!string.IsNullOrWhiteSpace(item[0].ToString())) 
        cbx.Items.Add(item[0].ToString()); 
      } 
     } 
     // Populate child 
     else if (e.ColumnIndex == x && e.RowIndex != -1) 
     { 
      DataGridViewComboBoxCell cbx = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[indexofchild]; 
      if (cbx?.Items != null) 
       cbx.Items.Clear(); 

      // Populate RESULT datatable from a SQL query 

      foreach (DataRow item in result.Rows) 
      { 
       if (!string.IsNullOrWhiteSpace(item[0].ToString())) 
        cbx.Items.Add(item[0].ToString()); 
      } 


     } 
    }