使用设计时架构 .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# 消化答案。
也许我没有完全理解您的实现,但是"设计时"数据集是常规类,我假设您显示的代码中的"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()
它解决了这个问题。现在,当表单关闭时,与表单关联的所有对象都将正确配置。这意味着数据集将重置为其设计时默认值,或者更确切地说,在再次打开窗体时创建一个新数据集。