使用设计时模式.NET将运行时更改重置为数据集

时间:2012-05-16 00:19:56

标签: c# .net vb.net dataset

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

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

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

3 个答案:

答案 0 :(得分:0)

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

如果您想完全删除数据集(实例),并对其进行任何更改,则只需创建另一个实例。

theDataset = new DatasetClassCreatedByTheDesigner();

答案 1 :(得分:0)

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

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

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

执行此操作

顺便说一句,您的代码使用的是DataTable,而不是DataSet。 DataSet没有列。他们改为使用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)

答案 2 :(得分:0)

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

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

ActionsSettingsForm.ShowDialog()

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

ActionsSettingsForm.ShowDialog()
ActionsSettingsForm.Dispose()

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