【问题标题】:Reset runtime changes to a dataset with a design time schema .NET使用设计时架构 .NET 重置对数据集的运行时更改
【发布时间】:2023-03-11 13:42:01
【问题描述】:

我有一个小型数据集,它的大部分架构是在设计时定义的,但我在运行时向其中一个表中添加了几列。我的问题是如何重置这些更改?

数据集未链接到任何数据源。它只有自己的表格,我“手动”填充。静态列已在设计时添加到数据表中。但是,我根据类别列表添加了一些列作为运行时。像这样:

For Each aCategory In theCategories
    theDataTable.Columns.Add(aCategory.CategoryName, System.Type.GetType("System.Boolean"))
Next

数据集用于在我的应用程序中弹出的一个小对话框中。我在使用 Load 事件打开对话框时添加动态列。第一次一切都很好。但是,如果您关闭对话框并重新打开它,就会出现问题。我的启动例程尝试再次添加动态列,但抛出一个错误,指出该列已存在。我已经尝试了很多事情并做了一些阅读,但我无法找到在对话框关闭时重置数据集的方法。唯一的解决方案是关闭整个应用程序并重新打开它。我在对话框表单的 Leave 事件中尝试了以下操作:

theDataSet.Reset()
theDataSet.Dispose()
theDataSet.RejectChanges()

这些似乎都没有影响,错误仍在继续。除了数据集之外,我还尝试将相同的方法应用于表。如:

theDataSet.Tables(0).Reset()
etc.

关于如何在表单关闭时完全删除数据集的任何想法?我在 VB 中给出了我的示例,但我可以用 VB 或 C# 来消化答案。

【问题讨论】:

  • 不要浪费你的脑力来解决这个问题。我已经用一个非常明确的解决方案回答了我自己的问题。但是,由于我的声誉低下,我无法在另外 6 个小时内发布我自己的问题的答案。

标签: c# .net vb.net dataset


【解决方案1】:

也许我没有完全理解您的实现,但“设计时”数据集是常规类,我假设您显示的代码中的“theDataSet”和您调用的方法是所述类的实例。

如果您想通过对数据集(实例)进行任何更改来完全消除数据集(实例),您只需创建另一个实例即可。

theDataset = new DatasetClassCreatedByTheDesigner();

【讨论】:

  • 我知道该选项并想知道是否可以使用它。但是,我在设计器中使用拖放创建了数据集。我将datagridview链接到设计器中的数据集,所以我只是直接使用设计器创建的对象。无需从中创建新对象。因此我不能使用新方法。这是一种不好的做法吗?
【解决方案2】:

有几种可能的方法可以解决您的问题。即:

  • 如果您的动态列已创建,请将其删除
  • 在添加动态列之前检查它们是否已创建。如果它们已创建,请重复使用它们,而不是添加新列

对于这两个选项,您需要向 DataSet 添加额外信息。您可以使用DataSet.ExtendedProperties Property 来做到这一点。

顺便说一句,您的代码使用的是 DataTable,而不是 DataSet。 DataSets 没有列。相反,它们具有 DataTables,而那些具有列。它们还具有 ExtendedProperties 属性,因此您可以使用此解决方案。

在第一个解决方案中,您可以添加具有原始列数的扩展属性。这样您就可以轻松地创建一个循环,删除最后一列,直到列数等于原始列数(您的代码在列集合的末尾添加新列)。你可以使用RemoveAt(dataTable.Columns.Count -1)

在第二种解决方案中,您可以使用一个简单的扩展属性,该属性包含一个布尔值,用于通知您是否已添加动态列。

您可以在接收 DataTable 作为参数的方法中实现此解决方案,以便您轻松重用代码。如果您愿意,您甚至可以创建一个扩展方法。

第二种方案的实现:

public static void RemoveExtraColumns(DataTable dt)
{
  // get original column count from extended property
  while(dt.Columns.Count > originalColumnCount)
    dt.Columns.RemoveAt(dt.Columns.Count -1);
}

如果你想将其用作扩展方法,请在静态类中实现它,并将其签名更改为:

public static void RemoveExtraColumns(this DataTable dt)

【讨论】:

  • 感谢您指出我在数据集与数据表方面的错误。我知道其中的区别,这只是我在创建帖子时的一个错误。我已经编辑了帖子。我想过使用您介绍的方法,并且之前在其他实现中实际使用过它们。但是,我认为必须有一种更简化的方法来将数据集重置为其设计时默认值。
【解决方案3】:

我已经回答了我自己的问题。事实证明,我的问题实际上与数据集或数据表无关,而与对话框有关。

我正在调用使用数据集的表单,如下所示:

ActionsSettingsForm.ShowDialog()

读完这篇文章:http://msdn.microsoft.com/en-us/library/aw58wzka.aspx 我意识到 dispose 方法只有在你使用 .show 而不是 .showdialog 时才会被自动调用。所以我将调用表单的代码更改为:

ActionsSettingsForm.ShowDialog()
ActionsSettingsForm.Dispose()

它解决了这个问题。现在,当表单关闭时,与表单关联的所有对象都已正确处理。这意味着数据集被重置为其设计时默认值,或者更确切地说,当再次打开表单时会创建一个新数据集。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2016-08-05
    • 2017-01-14
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多