Замена связанного столбца DataGridView с ComboBox - PullRequest
0 голосов
/ 25 апреля 2018

В этой статье MSDN предлагается, чтобы можно было изменить содержимое для автоматически созданного представления сетки данных с вашими собственными данными и заново связать один из его столбцов, изменив тип. Это не описывает точно , как действовать, хотя. Есть ряд вопросов, похожих на этот, но большинство из них по существу указывают на источники MSDN и не имеют реальных указаний, как именно действовать. Что наиболее важно, довольно непонятно, какие свойства установить в вашем настраиваемом столбце, чтобы убедиться, что он работает так же, как и автоматически сгенерированный столбец. Этот вопрос описывает аналогичную проблему, но пример совсем не минимален.

Предположим, у нас есть следующие вещи (как минимум):

  1. Таблица базы данных, содержащая несколько N столбцов. Один из этих столбцов содержит 3 разных значения. Допустим, это целочисленный столбец, который может содержать 0, 1 или 2.
  2. A DataGridView, который был связан с указанной таблицей базы данных в качестве источника данных.

Сам по себе VB.NET сгенерирует столбец textbox. Поскольку это не очень удобно для пользователя, я хотел бы заменить его, скажем, DataGridComboBoxColumn. Как можно это сделать?

1 Ответ

0 голосов
/ 25 апреля 2018

Как описано в в этом ответе , мне удалось создать столбец со списком и заполнить имеющиеся у него параметры в следующих данных примера (перечисленных здесь в формате JSON);

[{"id": 0, "type": "never"},
 {"id": 1, "type": "always"}, 
 {"id": 2, "type": "sometimes"}]

Предположим, мы связываем данные следующим образом (myOptions - это некоторый вспомогательный класс, который возвращает указанные выше данные в виде двух членов класса, id и типа). Предположим, что имя столбца таблицы базы данных - hasOption:

myDataGridView.Columns.Remove("hasOption")
Dim newColumn As New DataGridViewComboBoxColumn()
newColumn.DataSource = myOptions.GetChoices()
newColumn.DataPropertyName = "hasOption"
newColumn.ValueMember = "id"
newColumn.DisplayMember = "type"
newColumn.Name = "hasOption"
myDataGridView.Columns.Add(newColumn)

Важные факты здесь:

DataPropertyName должно точно соответствовать имени столбца источника данных (имя столбца таблицы базы данных)

ValueMember должен совпадать с именем столбца, который содержит значения (идентификаторы) для параметров поля со списком.

DisplayMember должен соответствовать имени столбца, который содержит отображаемый текст, для пользователя для параметров поля со списком.

При использовании списка опций (ручные данные, поэтому опции поля со списком не хранятся в базе данных, эти элементы опции (id и type в примере) должны быть реализованы as properties . Простое использование членов открытого класса приводит к странной ошибке при добавлении пользовательского столбца в DataGridView.

.

Класс-член value реализован так:

Public Class myOptions
Public Property type As String
Public Property id As Integer
Public Sub New(ByVal nType As String, ByVal nID As Integer)
    type = nType
    id = nID
End Sub

Private Shared allValues As List(Of myOptions) = New List(Of myOptions) From {
    New myOptions("never", 0),
    New myOptions("always", 1),
    New myOptions("sometimes", 2)
}

Public Shared Function GetChoices() As List(Of myOptions)
    Return allValues
End Function
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...