【问题标题】:c# DataColumn: generate a new GUID as default value?c# DataColumn:生成一个新的 GUID 作为默认值?
【发布时间】:2011-10-04 08:52:22
【问题描述】:

我的问题:
我有一个DataSet,里面有多个DataTables。 所有这些DataTables 都有一个名为“Id”的DataColumn,其中DataTypeSystem.Guid

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

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

我将此DataTable 分配给DataGridViewDataGridView 配置为允许创建、编辑和删除条目。

当用户现在创建一个新条目并保存它时,会出现“Id”未设置的异常。

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

我目前的想法:

  • dataSet.dataTable.Columns['Id'].DefaulValue 中指定一些魔法值。 (类似于<DBNull>
  • dataSet.dataTable 上使用触发器之类的东西来监听新行。它必须在行得到验证之前执行
  • 与触发器相同,但在 dataGridView 上。

我的尝试:

  • DataGridView 的这些事件:RowsAddedUserAddedRowRowValidatingDefaultValuesNeeded

如果有人能给我一个可行的解决方案或提示,那就太棒了!

~克里斯

【问题讨论】:

  • 但是如果用户将新行添加到 DataTable,我想象它通过使用某个函数 AddRow(DataRow row) 在代码中执行,如果只是在该函数中放置注入唯一 ID 值的代码呢?

标签: c# datagridview dataset guid


【解决方案1】:

我不知道你为什么说你不能使用DefaultValuesNeeded - 我刚刚测试过它并且它工作得很好:

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

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

【讨论】:

  • 是的,我猜它会这样工作。但我没有在视图中定义 guid 列,所以它不可用。
  • @cimnine 是的,所以不要从视图中删除到列,而是将其留在那里并隐藏列。那你应该没事。
  • 我猜下次我会这样做。这次我在DataTable 定义中添加了一个钩子,总是返回一个正确初始化的DataRow。看起来很优雅,但新的System.Guid 来自哪里并不明显,所以我下次更喜欢DataGridView 钩子。
【解决方案2】:

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

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

【讨论】:

  • 我想这是一个开始。我会试一试。现在谢谢!
  • 这是一个错误的开始;)RowsAdded 事件发生在通常将行添加到DataGridView 时,包括来自dataGridView.DataSource 的行。它不限于真正的“新”行。但是有UserAddedRow 事件,我不知何故错过了直到现在。我会看到^^
  • 哦,是的,我也错过了,看起来很有希望
  • 但没有成功,因为在触发事件时该行不存在DataRow。而且我没有在DataGridView 中显示“Id”列,所以我什至不能使用DefaultValuesNeeded 事件-.-*
【解决方案3】:

我希望使用 DefaulValue 来简化事情并替换我当前的解决方案,但在阅读了这个帖子之后,我似乎无法做到。

我当前的解决方案是在 DataGridView (Visible = false) 中添加 [ID] 列,如果 DataGridView RowValidating 事件中缺少它,则添加新的 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 { }
    }

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2019-07-07
    • 2016-03-22
    • 2015-09-07
    • 1970-01-01
    • 2021-07-08
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多