1

テキストボックス、チェックボックス、コンボボックスボタンを備えたウィンドウフォームがあります。元のWinForm要素の値を使用してデータベース内のデータを更新する別のクラスがあります。一部またはすべてのプロパティ(テキスト、チェック済みなど)にアクセスしたいこのクラスのフォーム要素のフィールドの。問題は-

1.パラメータ化された関数呼び出しを使用すると、パラメータ リストが大きくなりすぎます。eg-function(int a,bool c,string d,int e,int f,bool e,bool h,string g) これは機能していますが、非常に乱雑に見え、これが良いプログラミング方法論であるかどうかわかりません。

2.静的変数を使用できますが、静的変数の値を更新する別の関数を作成する必要があります。コンボボックスのインデックス変更のように(しかし、人々は静的を避けると言います..)

3. また、元のフォーム クラスのオブジェクトを多くの場所で繰り返し作成する必要があるため、メイン フォーム クラスのインスタンス オブジェクトを使用したくありません (これは明らかにリソースが非常に高価です)。優れたプログラミング方法のアカウントで使用するか、それを行うためのより良い方法があります...

4

4 に答える 4

0

1) すべてのパラメーターをクラスまたは構造体にグループ化し、そのインスタンスを GUI コントロールを更新する関数に渡すことができます。

2)これには静的変数を使用しないでください。この引数をグローバルにすることは、やりたいことではありません。

MyForm3) DB クライアント クラスで参照を渡して使用している場合、クラスの新しいインスタンスを作成していません。

// class with all data you want to use to update GUI controls
class MyData
{
   public string Text1 { get; set; }
   public string Text2 { get; set; }
   ...
}

// class which obtains data from a DB
class DBClient
{
   MyForm myForm;

   DBClient(MyForm myForm)
   {
       this.myForm = myForm; // you're just passing a reference to MyForm here, you're not creating a new object
   }

   void UpdateFormControls()
   {
       MyData data = ...; // fill it with data obtained from from DB 
       myForm.UpdateControls(data);
   }
}

// your custom form containing various controls
class MyForm : Form
{
   DBClient dbClient;

   MyForm()
   {
      dbClient = new DBClient(this);
   }

   public void UpdateControls(MyData data)
   {
      if (InvokeRequired)
      {
         this.BeginInvoke((MethodInvoker) delegate { UpdateControls(data); });
         return;
      }

      control1.Text = data.Text1;
      control2.Text = data.Text2;
      ...
   }   
}

インターフェイスを実装してから、クラス でインターフェイス参照を使用することにより、分離DBClientして使用することをお勧めします。MyFormMyFormDBClient

于 2013-05-15T09:28:55.333 に答える