5

Я хочу иметь DataGridView, который имеет два столбца. Первый столбец всегда будет иметь тип DataGridViewComboBoxColumn. Основываясь на выборе в этом столбце, я хотел бы иметь возможность изменить соответствующую ячейку во втором столбце на DataGridViewComboBoxCell или DataGridViewTextBoxCell.Как переключаться между DataGridViewTextBoxCell и DataGridViewComboBoxCell?

Я думаю, мне просто нужно сделать второй столбец типа DataGridViewColumn, но не понимаю механику изменения типа ячейки на лету.

Я работаю с VB.NET в Visual Studio 2005.

Спасибо заранее!

Update: Один путь вокруг этого, я полагаю, сделать второй столбец как DataGridViewComboBoxColumn и изменять атрибуты ячейки так, что он либо ведет себя как выпадающий список, или как (редактируемые), без элементов. Последний выглядит достаточно, как текстовое поле, в котором я мог бы жить с ним, и это не связано с изменением типа ячейки.

ответ

3

У меня нет версии VB.Net, но, надеюсь, этот быстрый фрагмент C# поможет вам или направит вас в правильном направлении.

В этом примере я создал простой DataGridView с двумя столбцами. Первый из них - DataGridViewComboBox, заполненный двумя вариантами: «Текст» или «Комбо».

Второй столбец изначально установлен в DataGridViewTextBoxColumn из конструктора.

Я обрабатываю событие CurrentCellDirtyStateChanged в DataGridView. Я проверяю, загрязнен ли элемент и проверяет только первый столбец (ComboBox). Вы должны вызвать CommitEdit, чтобы получить новое значение в комбо, иначе вы будете смотреть на предыдущее значение. На основе выбора в поле со списком я затем переписываю ячейку во втором столбце новой ячейкой этого типа.

Вы бы добавили свою собственную логику (заселяете выпадающие списки и обрабатываете значение). Возможно, вам захочется сохранить значение, а затем вернуть его в ячейку или что-то еще.

Вот код, который я использовал и сделал быстрый и грязный тест на:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
    { 
     if (dataGridView1.IsCurrentCellDirty == false) 
     { 
      return; 
     } 

     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 

     if (dataGridView1.CurrentCell.ColumnIndex == 0) 
     {    
      if (((string)dataGridView1.CurrentCell.Value) == "Text") 
      { 
       dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell(); 
      } 
      else if (((string)dataGridView1.CurrentCell.Value) == "Combo") 
      { 
       dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell(); 
      } 
     } 
    } 

Вот быстрый перевод VB, что я проверил и работает.

Public Class Form1 

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged 

    If DataGridView1.IsCurrentCellDirty = False Then 
     Return 
    End If 

    DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) 

    If DataGridView1.CurrentCell.ColumnIndex = 0 Then 

     If CStr(DataGridView1.CurrentCell.Value) = "Text" Then 
      DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell 

     ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then 
      DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell 
     End If 

    End If 


End Sub 

End Class

Вы потеряете значение, сохраненное в этом столбце, так что вам нужно будет, чтобы сохранить его первым.

Jon

+0

Спасибо. Это полезно. Я не действительно VB или.NET, поэтому я вижу, что вы делаете в принципе, но механика выделения нового DataGridViewTextBoxCell или нового DataGridViewComboBoxCell в VB - это то, что мне еще предстоит выяснить. В любом случае я ценю время, которое вы вложили в свой ответ, и я попробую это сегодня днем. – John

+0

Отлично работает. Спасибо! – John

2

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

This sample создает ячейку переключателя, нетрудно изменить код для размещения пользовательского элемента управления.

0
dgvCell = new DataGridViewTextBoxCell();   // code to remove checkbox 
     dgvCell.Value = string.Empty; 
     dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell; 
Смежные вопросы