我有一个小型数据集,其大部分架构在设计时定义,但我在运行时向其中一个表添加了几列。我的问题是如何重置这些更改?
数据集未链接到任何数据源。它只有我自己的“手动”填充表。静态列已在设计时添加到数据表中。但是,我根据类别列表添加了几列作为运行时。像这样:
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#来消化答案。
答案 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()
它解决了这个问题。现在,当表单关闭时,与表单关联的所有对象都会正确处理。这意味着数据集将重置为其设计时默认值,或者在再次打开表单时创建一个新数据集。