Установите значение связанного поля в NULL, используя DataGridViewComboBoxColumn в DataGridView

У меня есть DataGridViewComboBoxColumn в DataGridView, основанном на таблице поиска.

Поля ValueMember и DisplayMember привязаны к строковым столбцам в DataTable. Все строки имеют значения для обоих полей, за исключением специальной записи, в которой для поля значения намеренно установлено значение NULL.

Однако, когда я выбираю эту запись, вместо DBNull.Value в DataTable, привязанной к DataGridView, используется пустая строка. Это происходит во время ввода данных, прежде чем данные будут отправлены в базу данных.

Я проверил классы DataGridViewComboBoxColumn и DataGridView - похоже, нет простого способа настроить это поведение. Кто-нибудь знает, возможно ли это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 732
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что ж, я придумал решение а. Поскольку 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.

Другие вопросы по теме