使用设计时架构 .NET 重置对数据集的运行时更改

本文关键字:数据集 运行时 NET | 更新日期: 2023-09-27 18:34:28

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

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

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# 消化答案。

使用设计时架构 .NET 重置对数据集的运行时更改

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

如果要通过对数据集(实例(所做的任何更改完全擦除数据集(实例(,只需创建另一个实例即可。

theDataset = new DatasetClassCreatedByTheDesigner();

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

  • 如果已创建动态列,请将其移除
  • 如果在添加动态列之前已创建动态列,请选中它们。如果已创建,请重用它们,而不是添加新列

对于这两个选项,您需要向数据集添加额外信息。可以使用 DataSet.ExtendedProperties 属性执行此操作。

顺便说一下,您的代码使用的是数据表,而不是数据集。数据集没有列。相反,它们具有数据表,而那些具有列的数据表。它们还具有 ExtendedProperties 属性,以便您可以使用此解决方案。

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

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

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

实施第二个解决方案:

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)

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

我调用使用数据集的形式如下:

ActionsSettingsForm.ShowDialog()

阅读本文后:http://msdn.microsoft.com/en-us/library/aw58wzka.aspx 我意识到,只有当您使用 .show 而不是 .showdialog 时,才会自动调用 dispose 方法。所以我将调用表单的代码更改为:

ActionsSettingsForm.ShowDialog()
ActionsSettingsForm.Dispose()

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