我的问题:
我有一个DataSet
,里面有多个DataTables
。所有这些DataTables
都有一个名为"Id"的DataColumn
, 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
如果有人能给我一个有效的解决方案或提示,那就太棒了!
克里斯~
我不知道为什么你说你不能使用DefaultValuesNeeded
-我刚刚测试了这个,它工作得很好:
void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
e.Row.Cells["Guid"].Value = Guid.NewGuid();
}
我将Guid列的visibility属性设置为false,这样它就不显示了。当创建新行时,该行将填充一个guid。
是的,只需使用适当的事件并将GUID值添加到正确的列。如果该列对用户可见,则可以在用户单击新行的其中一个单元格时添加该列。也许RowsAdded事件可以完成这项工作
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowsadded.aspx我希望使用DefaulValue来简化事情并取代我当前的解决方案,但在阅读此线程后,看起来我不能。
我目前的解决方案是在DataGridView(可见= false)中有[ID]列,并添加新的GUID,如果它在DataGridView rowvalidation事件上缺失。
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 { }
}