我的问题:
我有一个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
如果有人能为我提供工作解决方案或提示,那将是非常棒的!
〜克里斯
答案 0 :(得分:6)
我不确定你为什么说你不能使用DefaultValuesNeeded
- 我刚试过这个并且它完美无缺:
void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
e.Row.Cells["Guid"].Value = Guid.NewGuid();
}
我将Guid列的visibility属性设置为false,以便它不显示。创建新行时,该行已填充guid。
答案 1 :(得分:1)
是的,只需使用相应的事件并将GUID值添加到正确的列。如果该列对用户可见,则可以在用户单击新行的其中一个单元格时添加该列。也许RowsAdded事件将完成这项工作
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowsadded.aspx
答案 2 :(得分:0)
我希望使用DefaulValue来简化操作并替换我当前的解决方案,但在阅读完这个帖子之后看起来我不能。
我当前的解决方案是在DataGridView中使用[ID]列(Visible = false),如果在DataGridView RowValidating事件中缺少新GUID,则添加新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 { }
}