c # DataColumn: генерировать новый GUID в качестве значения по умолчанию? - PullRequest
3 голосов
/ 13 июля 2011

Моя проблема:
У меня есть DataSet с несколькими DataTables в нем. Все эти DataTables имеют DataColumn с именем "Id" и DataType System.Guid.

Краткий пример такой таблицы:

+--------------------+
| User               |
+--------------------+
| *Id as System.Guid |
| Username as String |
| /* more columns */ |
+--------------------+

Я назначил DataTable для DataGridView. DataGridView настроен на создание, редактирование и удаление записей.

Когда пользователь теперь создает новую запись и сохраняет ее, есть исключение, что «Id» не установлен.

Мой вопрос:
Как можно автоматически создать новый System.Guid для новых записей?

Мои нынешние мысли:

  • Указание некоторого магического значения в dataSet.dataTable.Columns['Id'].DefaulValue. (Что-то вроде <DBNull>)
  • Использование чего-то вроде триггера на dataSet.dataTable прослушивании новых строк. Должно быть выполнено до проверка строки
  • То же самое, что и курок, но на dataGridView.

Что я пробовал:

  • Эти события DataGridView: RowsAdded, UserAddedRow, RowValidating, DefaultValuesNeeded

Было бы здорово, если бы у кого-нибудь было рабочее решение или подсказка для меня!

~ Chris

Ответы [ 3 ]

6 голосов
/ 13 июля 2011

Я не уверен, почему вы говорите, что не можете использовать DefaultValuesNeeded - Я только что проверил это, и он отлично работает:

void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
    e.Row.Cells["Guid"].Value = Guid.NewGuid();
}

Я установил для свойства видимости столбца Guid значение false, чтобы оно не показывалось. Когда создается новая строка, в нее вводится указатель.

1 голос
/ 13 июля 2011

Да, просто используйте соответствующее событие и добавьте значение GUID в правильный столбец. Если столбец видим для пользователя, вы можете добавить его, когда пользователь щелкает одну из ячеек для новой строки. Возможно, событие RowsAdded сделает работу

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowsadded.aspx

0 голосов
/ 22 февраля 2013

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

Мое текущее решение состоит в том, чтобы иметь столбец [ID] в DataGridView (Visible = false) и добавить новый GUID, если он отсутствует в событии DataGridView RowValidating.

    private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
    {
        try
        {
            //If ID is empty create a new GUID
            Guid guidID = Guid.NewGuid();
            if (this.dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString() == "")
                this.dataGridView1.Rows[e.RowIndex].Cells[2].Value = guidID;

        }
        catch { }
    }
...