0

VS 2010 と C# Windows フォームを使用しています。ユーザーが持っているオブジェクトの数とそれぞれの重みを入力する必要があります。次に、それぞれを処理する必要があります。私は通常、行コレクションの各データ行に使用します。

質問は、非常に厄介なコードの一部をクリーンアップしようとしたことです (これは私の最初の実際のプロジェクトです) コードが 5000 行以下のメイン クラスが 1 つあり、特定のモジュール セットを独自のクラスに分割したいと考えています。問題は、ユーザーが必要なデータを追加できるように、メイン フォーム (DSObjects) にデータセットを設定し、テーブル グリッド ビューといくつかの入力ボックスを追加ボタンでリンクする必要がある情報を入力するときです。私が抱えている問題は、コードを実行してクラスをサブクラスに分割すると、新しいクラスごとにデータセットが消去されることです。

4

3 に答える 3

3

すべてのクラスでデータ セットの新しいインスタンスを作成するのではなく、次のように 1 つのインスタンスを渡します。

public class AnotherClass
{
    private DataSet m_dataSet;

    public AnotherClass(DataSet ds)
    {
        m_dataSet = ds;
    }
}

使用の新しいインスタンスを作成する場合AnotherClass:

AnotherClass ac = new AnotherClass(m_dataSet);

ここm_dataSetでも、データセットを参照するメンバー変数です。コンストラクターで呼び出し元のクラスに渡されるか、(メインクラスの場合) コードのどこかに作成されます。

メイン クラスなどで、データ セットを 1 回だけ作成します。

もう 1 つの方法は、データ セットのインスタンスを保持するシングルトン クラスを使用することです。シングルトンは、多くの異なるオブジェクトからアクセスできます。

スレッドセーフでないサンプルは次のようになります。

public class DataHolder
{
    private DataSet m_dataSet;
    private static DataHolder m_instance;

    private DataHolder()
    {
        m_dataSet = ... // Fill/Create it here
    }

    public static DataHolder Instance
    {
        get
        {
            if (m_instance = null)
                m_instance = new DataHolder();
            return m_instance;
        }
    }

    public DataSet Data
    {
        get { return m_dataSet; }
    }
}

次に、DataHolder.Instance.Data;を使用してアクセスします。

于 2013-01-28T14:08:38.373 に答える
0

データセットを各クラスのコンストラクターに渡してみることができます

var something = new Something(dataset)
于 2013-01-28T14:06:04.390 に答える
0

DataSetは、実際にはメモリ内の小さな(ただし完全な)データベースであることに注意してください。ほとんどのアプリケーションは、データベースサーバーからアプリケーション内のオブジェクトにデータを転送するためにそれを使用しますが、完全なデータベースのすべての部分があります。複数のテーブルを結合して関係を作成し、それらに対してクエリを実行できます。

そのことを念頭に置いて、クラスごとに個別のデータベースを用意するのではなく、アプリケーション全体でデータベースをグローバルに使用するのと同じように、アプリケーション内のすべてのオブジェクトで1つのデータセットを共有することも同様に非常に合理的です。

于 2013-01-28T14:16:12.837 に答える