0

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

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

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

4

3 回答 3

0

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

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

theDataset = new DatasetClassCreatedByTheDesigner();
于 2012-05-16T00:32:25.827 回答
0

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

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

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

顺便说一句,您的代码使用的是 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)
于 2012-05-16T01:03:05.690 回答
0

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

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

ActionsSettingsForm.ShowDialog()

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

ActionsSettingsForm.ShowDialog()
ActionsSettingsForm.Dispose()

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

于 2012-05-16T14:38:49.883 回答