2

У меня есть DatagridviewComboBoxColumn, заселенный из DataTable, и всякий раз, когда я нажимаю на любую часть DataGridViewComboBoxCell, первое значение списка отображается, как было нажато. Однако, когда я перемещаю фокус в другую ячейку, не выбирая значения, она исчезает.VB.Net DatagridviewComboBoxColumn Поведение CellClick

Странно, поведение несовместимо, если я применяю значения ComboBox с помощью .Items.Add (""). Может кто-нибудь пролить свет на эту проблему. Ниже приведен пример кода и рисунок:

Public Class Form1 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    DataGridView1.Rows.Add() 
    DataGridView1.Rows.Add() 

    ''DataGridViewComboBoxColumn1 
    DataGridViewComboBoxColumn1.Items.Add("Name1") 
    DataGridViewComboBoxColumn1.Items.Add("Name2") 

    'DataGridViewComboBoxColumn2 
    Dim dt As New DataTable 
    dt.Columns.Add("id") 
    dt.Columns.Add("name") 
    dt.Rows.Add("1", "Name1") 
    dt.Rows.Add("2", "Name2") 
    With DataGridViewComboBoxColumn2 
     .ValueMember = dt.Columns(0).ColumnName 
     .DisplayMember = dt.Columns(1).ColumnName 
     .DataSource = dt 
    End With 
End Sub 

End Class 

enter image description here

+0

Это звучит как «обычное» поведение. Его нужно нажать. – noidea

+0

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

+0

Я тестировал его, и он отлично работает. Но вы должны щелкнуть элемент, который хотите, а не просто «выбрать» его. Это проблема пользователя, а не плохое поведение. – noidea

ответ

0

Я нашел способ исправить поведение, обратившись к этому сообщению: DataGridComboBoxColumn shows first value on CellEnter

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

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing 
     If TypeOf e.Control Is ComboBox Then 
      Dim comboBox As ComboBox = DirectCast(e.Control, ComboBox) 
      If DataGridView1.CurrentCell.Value Is Nothing Then comboBox.SelectedIndex = -1 
     End If 
    End Sub 
0

успешно реплицировать поведение, но я также добавил 2 ComboBox в той же форме, и результат такой же

Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     DataGridView1.Rows.Add() 
     DataGridView1.Rows.Add() 

     ''DataGridViewComboBoxColumn1 


     DataGridViewComboBoxColumn1.Items.Add("Name1") 
     DataGridViewComboBoxColumn1.Items.Add("Name2") 

     'DataGridViewComboBoxColumn2 
     Dim dt As New DataTable 
     dt.Columns.Add("id") 
     dt.Columns.Add("name") 
     dt.Rows.Add("1", "Name1") 
     dt.Rows.Add("2", "Name2") 
     With DataGridViewComboBoxColumn2 
      .ValueMember = dt.Columns(0).ColumnName 
      .DisplayMember = dt.Columns(1).ColumnName 
      .DataSource = dt 
     End With 

     ComboBox1.Items.Add("Name1") 
     ComboBox1.Items.Add("Name2") 

     With ComboBox2 
      .ValueMember = dt.Columns(0).ColumnName 
      .DisplayMember = dt.Columns(1).ColumnName 
      .DataSource = dt 
     End With 

    End Sub 
End Class 

Click to see gif of form in action

+0

Как вы видите, Name1 появляется в столбце2 без фактического выбора, тогда как в случае столбца 1 он остается пустым. Мой вопрос заключается в том, как иметь такое же поведение, как в столбце1, используя источник данных, поскольку это может смутить пользователей. –

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