У меня есть DataGridViewComboBoxColumn в DataGridView, основанном на таблице поиска.
Поля ValueMember и DisplayMember привязаны к строковым столбцам в DataTable. Все строки имеют значения для обоих полей, за исключением специальной записи, в которой для поля значения намеренно установлено значение NULL.
Однако, когда я выбираю эту запись, вместо DBNull.Value в DataTable, привязанной к DataGridView, используется пустая строка. Это происходит во время ввода данных, прежде чем данные будут отправлены в базу данных.
Я проверил классы DataGridViewComboBoxColumn и DataGridView - похоже, нет простого способа настроить это поведение. Кто-нибудь знает, возможно ли это?





Что ж, я придумал решение а. Поскольку DataGridView привязан к данным, я реализовал событие ColumnChanging для DataTable. Образец кода:
void Schedule_ColumnChanging(object sender, DataColumnChangeEventArgs e)
{
if
(
e.Column.ColumnName == "Site" &&
e.ProposedValue is string &&
e.ProposedValue as string == ""
)
e.ProposedValue = DBNull.Value;
}
Это трюк. Хотя хотелось бы знать, есть ли решение, которое можно реализовать на уровне управления DataGridView.
Я использую типизированный набор данных, чтобы указать значения для раскрывающегося списка. После заполнения значений из базы данных я добавляю строку Другая, чтобы обеспечить нулевую поддержку. Последние строки метода, заполняющего таблицу данных, выглядят так ...
// Fill dt from datatable...
var nullRow = rv.NewRunDropDownEntryRow();
nullRow.SetIDNull();
nullRow.Title = "None";
rv.AddRunDropDownEntryRow(nullRow);
rv.AcceptChanges();
После этого это просто работает! Нулевое значение отображается как «Нет» в раскрывающемся списке, вы можете легко обновить его до нуля или наоборот в связанной строке.
HTH - Ричард
В моей таблице поиска в базе данных нет записи «Нет». В результате запись «Нет» была запрещена. Ограничение внешнего ключа предотвратило запись «None» в дочернюю таблицу, содержащую идентификатор, соответствующий таблице поиска.
Мое решение заключалось в том, чтобы вручную добавить строку, содержащую «None», в загрузку формы (после того, как TableAdapter уже заполнил таблицу реальными строками из базы данных).
//' Add a 'None' row to allow the user to un-select a lookup item
//' The insert and update stored procedure translates a 'None' entry to NULL.
Dim newRow As MyLookupDataset.MyTableRow = Me.MyLookupDataset.MyTable.NewMyTableRow
newRow.MyID = "None"
newRow.MyDesc = "None"
Me.MyLookupDataset.MyTable.Rows.InsertAt(newRow, 0)
Я использовал хранимые процедуры для операторов Insert и Update адаптера таблицы. В хранимых процедурах я проглатываю запись «None» - это означает, что если «None» получено в качестве параметра процедуры, я заменяю ее на NULL. Это позволяет пользователю выбрать «None», но после сохранения запись возвращается к NULL.