3

ユーザーが入力したさまざまなタイプのデータを使用するのに十分な柔軟性が必要なユーティリティを作成しています。異なるデータだけでなく、1人のユーザーが「RoryGallagher」、別の「Merle Travis」、別の「Louis Jordan」、さらに別の「GatemouthBrown」と入力する場合があります。

あるユーザーが「RoryGallagher」、別の「42」、日付(9/8/1956など)とID値(「00034872184」など)の両方を入力するようなものです。

したがって、問題はGUIにあります。フォームの入力を求めるセクションをどのように「スワップアウト」できますか?99%同じであるいくつかのユーティリティを作成するのはやり過ぎのようです。ただし、アプリの「バージョン」によっては、TextBoxとともに単一の「値を入力」ラベルが必要な場合もあれば、2つ以上の情報の入力を求める必要がある場合もあります。

別のフォームを呼び出すような「データの入力」ボタンをフォームに配置したくありません。ユーザーが1ビットの情報を入力するだけでよい場合、それは非常に奇妙に思えるからです。

ストラテジーパターンは将来ここにあるかもしれないと思っていますが、GUIの部分はまだ難問です。WPFを使用している方が簡単ですが、そうではありません。「最大の」シナリオを組み込むのに十分な大きさのままにしておくフォームのセクションをまだ持つことができると思いますが、それが最善の方法ですか?

アップデート

私は以下の提案を試しました:

フォームにパネルを追加し、[追加]|[追加]を使用してユーザーコントロールを作成しました。UserControlとこれを試しました:

panel1.Controls.Add(UserControl1);
UserControl1.Dock = DockStyle.Fill; 

...しかし、壮大な失敗に見舞われました( "'PlatypiRUs.UserControl1'は'タイプ'ですが、'変数'のように使用されます"および"非静的フィールド、メソッド、またはプロパティ'システムにはオブジェクト参照が必要です。 Windows.Forms.Control.Dock.get'")

もう一度更新

これで今の壮大な成功:

UserControl1 usr1 = new UserControl1();
panel1.Controls.Add(usr1);
usr1.Dock = DockStyle.Fill;
4

2 に答える 2

4

フォームのそのセクションに別のユーザー コントロールを動的にロードすることをお勧めします。設計時の単純化のために、動的コントロールが配置される場所にパネルを配置し、ドッキングをオンにしてそのパネルに読み込むだけで、パネル全体を埋めることができます。次に、必要なデータ入力フィールドのセットごとに個別のユーザー コントロールを作成するだけです。たとえば、pnlCustom というパネル コントロールがある場合は、フォームの load イベント (または適切な場所) で次の操作を実行できます。

UserControl1 customControl = new UserControl1();
pnlCustom.Controls.Add(customControl);
customControl.Dock = DockStyle.Fill;
于 2012-06-06T13:37:03.460 に答える
1

私の意見では、これはビルダーパターンです。

基本的に、フォームは「2段階表示」と考えてください。つまり、次のようになります。

  • フォーム要素(テキストボックス、ドロップダウンなど)を定義する構造を考えてください。
  • 抽象ビュービルダー(ファーストステップビルダー)を実装して、さまざまな状況でさまざまな構造を作成できるようにします(構造は一般的であり、具体的なUIコンポーネントを含める必要はなく、それらを定義する構造のみを使用する必要があります)。
  • 構造が異なる必要があるすべての場合に抽象ビルダーを実装します。
  • 次に、共通の構造を取り、UIコンポーネントを構築するUIビルダーを実装します。基本的に、このビルダーは、共通の構造をプラットフォーム固有のUIコンポーネント(win-formsテキストボックスやHtml入力など)に変換するだけです。

次のステップは、明らかにデータを処理することです。そのためには、抽象的なプロセッサと、状況ごとの具体的な実装があります(上記の最初のステップビルダーと同様)。

これで、UIの構築とデータ処理を1対1で関連付けることができることは明らかです。つまり、状況はファクトリであり、ビュービルダーとデータプロセッサを生成します。

擬似コードは次のようになります。

// construct the view.
var factory = Situation.GetCurrentSituationFactory(); //abstract factory.
var uiBuilder = factory.GetUIBuilder(); //abstract builder
var structure = uiBuilder.GetFormStructure([context goes here]); //build view definition
var viewParser = Platform.GetViewParser(); //abstract builder (step 2)
viewParser.ConstructForm([context with form goes here]); //build form UI

// later on, process the input data.
var input = viewPrser.GetInput([context with form goes here]); //input definition
var dataProcessor = factory.GetDataPocessor(); //strategy
dataProcessor.Process(input); //execute processing strategy

さらに、これは動的コントロールやフォームの作成に使用するその他のものと競合しません。抽象的懸念を正しく実装するだけです。

于 2012-06-06T13:57:29.570 に答える