c#DataColumn:是否生成一个新的GUID作为默认值?

c#DataColumn:是否生成一个新的GUID作为默认值?,c#,datagridview,dataset,guid,C#,Datagridview,Dataset,Guid,我的问题: 我有一个数据集,其中包含多个数据表。 所有这些DataTables都有一个名为“Id”的DataColumn,其数据类型为System.Guid 此类表格的一个简短示例: +--------------------+ | User | +--------------------+ | *Id as System.Guid | | Username as String | | /* more columns */ | +-------------------

我的问题:
我有一个
数据集
,其中包含多个
数据表
。 所有这些
DataTables
都有一个名为“Id”的
DataColumn
,其数据类型为
System.Guid

此类表格的一个简短示例:

+--------------------+
| User               |
+--------------------+
| *Id as System.Guid |
| Username as String |
| /* more columns */ |
+--------------------+
我将此
DataTable
分配给
DataGridView
DataGridView
配置为允许创建、编辑和删除条目

当用户现在创建一个新条目并保存它时,“Id”未设置是一个例外

我的问题:
如何为新条目自动生成新的
System.Guid

我当前的想法:

  • dataSet.dataTable.Columns['Id'].DefaulValue
    中指定一些神奇的值。(类似于
  • 使用类似于dataSet.dataTable上的触发器的方法侦听新行。必须在验证行之前执行它
  • 与触发器相同,但在
    dataGridView
我所尝试的:

  • DataGridView
    的以下事件:
    RowsAdded
    UserAddedRow
    rowsvalidating
    defaultvalues所需
如果有人能给我一个有效的解决方案或提示,那就太棒了


~Chris

是的,只需使用适当的事件并将GUID值添加到正确的列中。如果该列对用户可见,则可以在用户单击新行的某个单元格时添加该列。也许RowsAdded事件将完成这项工作


我不知道你为什么说你不能使用所需的
defaultvalues
-我刚刚测试了这个,它工作得很好:

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

我将Guid列的visibility属性设置为false,这样它就不会显示。当创建新行时,该行已填充guid。

我希望使用DefaulValue来简化事情并替换当前的解决方案,但在阅读此线程后,我似乎无法这样做

我当前的解决方案是在DataGridView中设置[ID]列(Visible=false),如果DataGridView行验证事件中缺少新的GUID,则添加它

    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 { }
    }

但是如果用户向DataTable添加新行,我会在代码中使用一些函数AddRow(DataRow row),如果只是在该函数中放入注入唯一ID值的代码呢?我想这是一个开始。。我要试一试。现在谢谢你!这是一个错误的开始;)通常,当将行添加到
DataGridView
时,包括从
DataGridView.DataSource
添加行时,会发生
RowsAdded
事件。它并不局限于真正的“新”行。但是有一个
UserAddedRow
事件,我至今不知怎么错过了。我会看到^^哦,是的,我也错过了那一行,看起来很有希望,但它没有成功,因为在触发事件时,该行不存在
DataRow
。而且我没有在
DataGridView
中显示'Id'列,所以我甚至不能使用
DefaultValuesNeeded
事件-。-*是的,我想这样会起作用。。但是我没有在视图中定义guid列,所以它不可用。@cimnine是的,所以不要从视图中删除to列,而是将其保留在那里并隐藏列。那你就没事了。我想下次我会这么做的。这次我在
DataTable
定义中添加了一个钩子,它总是返回一个正确初始化的
DataRow
。看起来很优雅,但是新的
System.Guid
来自何处并不明显,所以下次我更喜欢
DataGridView
钩子。