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
钩子。