Установите значение связанного поля в NULL, используя DataGridViewComboBoxColumn в DataGridView - PullRequest
3 голосов
/ 03 декабря 2008

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 03 декабря 2008

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

0 голосов
/ 15 ноября 2010

Моя таблица поиска в базе данных не имеет записи "Нет". В результате запись «Нет» не была разрешена. Ограничение внешнего ключа предотвратило запись «Нет» в дочерней таблице, содержащей идентификатор, соответствующий таблице поиска.

Мое решение состояло в том, чтобы вручную добавить строку, содержащую «Нет», в загрузку формы (после того, как 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)

Я использовал хранимые процедуры для операторов вставки и обновления TableAdapter. В хранимых процедурах я проглатываю запись «None» - это означает, что если в качестве параметра процедуры принимается «None», я заменяю ее на NULL. Это позволяет пользователю выбрать «Нет», но после сохранения запись возвращается к NULL.

0 голосов
/ 29 июля 2009

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

// Fill dt from datatable...
var nullRow = rv.NewRunDropDownEntryRow();
nullRow.SetIDNull();
nullRow.Title = "None";
rv.AddRunDropDownEntryRow(nullRow);
rv.AcceptChanges();

После этого просто работает ! Значение NULL отображается в раскрывающемся списке как «Нет», его можно легко обновить до или с нуля в связанной строке.

HTH - Ричард

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...