0

スキーマのほとんどが設計時に定義されている小さなデータセットがありますが、実行時にそのテーブルの1つにいくつかの列を追加します。私の問題は、これらの変更をリセットするにはどうすればよいですか?

データセットはどのデータソースにもリンクされていません。それは私が「手動で」入力する独自のテーブルを持っているだけです。静的列は、設計時にデータテーブルに追加されています。ただし、カテゴリのリストに基づいて、ランタイムとしていくつかの列を追加します。このような:

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

問題を解決するには、いくつかの方法があります。すなわち:

  • 動的列が作成されている場合は、それらを削除します
  • 追加する前に、動的列が作成されているかどうかを確認してください。それらが作成されている場合は、新しい列を追加する代わりにそれらを再利用します

どちらのオプションでも、追加情報を DataSet に追加する必要があります。DataSet.ExtendedProperties プロパティを使用してそれを行うことができます。

ところで、あなたのコードは DataSet ではなく DataTable を使用しています。DataSet には列がありません。代わりに DataTables があり、それらには列があります。また、このソリューションを使用できるように、ExtendedProperties プロパティもあります。

最初のソリューションでは、元の列数を持つ拡張プロパティを追加できます。列の数が元の列と等しくなるまで、最後の列を削除するループを簡単に作成できるようにします (コードは列コレクションの最後に新しい列を追加します)。を使用できますRemoveAt(dataTable.Columns.Count -1)

2 番目のソリューションでは、動的列が追加されたかどうかを通知するブール値を保持する単純な拡張プロパティを使用できます。

このソリューションは、DataTable をパラメーターとして受け取るメソッドに実装できるため、コードを簡単に再利用できます。必要に応じて、拡張メソッドを作成することもできます。

2 番目のソリューションの実装:

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 .showdialog ではなく .show を使用した場合にのみ、dispose メソッドが自動的に呼び出されることに気付きました。そこで、フォームを呼び出すコードを次のように変更しました。

ActionsSettingsForm.ShowDialog()
ActionsSettingsForm.Dispose()

そして、それは問題を解決しました。フォームが閉じられると、フォームに関連付けられたすべてのオブジェクトが適切に破棄されるようになりました。これは、データセットが設計時のデフォルトにリセットされるか、フォームが再度開かれたときに新しいデータセットが作成されることを意味します。

于 2012-05-16T14:38:49.883 に答える