2012-04-25 11 views
2

私は、親レコードを持つリストスタイルフォームと、選択した親レコードの多くの関連子レコードを持つWindowsフォームアプリケーションを用意しています。WindowsフォームC#

ie。

私のフォームレイアウトには親レコードのリストがあり、ユーザーが親レコードを選択すると、フォーム上の他のリストに関連する子情報が入力されます。これらのすべてのリストは、ユーザーがレコードの詳細フォームを開くことができます。例えば、ユーザは顧客1を選択してから詳細を選択することができ、顧客1の情報が表示された顧客の詳細フォームが開く。ユーザは戻ることができ、顧客1の関連レコードを選択することができ、請求書1とし、請求書1の情報を表示する請求書明細書を開くことができる。

したがって、任意の時点で、ユーザーはいくつかの請求書/見積書/連絡書などの詳細フォームを開くことがあります。また、別の顧客を選択して、詳細フォームを開くのと同じプロセスを実行することもできます。

カスタマー1が選択され、ユーザーが詳細フォームを表示したい場合、顧客1の詳細フォームが既に開いているかどうかを確認する必要があります。

私は、この声明では、何が良い練習であると思われているのでしょうか。

私は何らかの形ですべてのフォームに適用できる一般的なアプローチを見つけようとしていました。

+0

これらの詳細フォームを開いたときに私の元々の質問にさらに複雑になりましたが、リストも含まれている可能性があります。このリストは、より詳細なフォームを生成することができます。私はそれが関連する形の木のようだと思います。私が持っている主な問題は、フォームのこのツリーのどこかで親情報を削除すると、関連する詳細フォームを探してそれに応じて閉じるすべての開いたフォームを調べる必要があるということです。私はそれがIdとparentIdのテーブルを参照し、特定のIDに関連するすべての子レコードを削除したいと思います。 - – trailerman

答えて

0

あなたができることは、左側に顧客のリストを作成し、右側に顧客情報があるパネルを作成することです。顧客をクリックすると、パネルに新しい顧客情報が更新されます。

(エクスプローラでは、Windowsでどのように機能するかを考える。左側のフォルダ、右側に選択したフォルダの情報)

などの名前や請求書のリストをクリックすると、顧客情報を保持するパネル請求書に新しい請求書が表示されます。顧客の詳細を新しい形式で開く必要はありません。

+0

私のオリジナルの質問に加えて、これらの詳細フォームが開かれたときにさらに複雑になることもあります。リストも含まれている可能性があります。このリストは、より詳細なフォームを生成することができます。私はそれが関連する形の木のようだと思います。私が持っている主な問題は、フォームのこのツリーのどこかで親情報を削除すると、関連する詳細フォームを探してそれに応じて閉じるすべての開いたフォームを調べる必要があるということです。私はそれがIdとparentIdのテーブルを参照し、特定のIDに関連するすべての子レコードを削除したいと思います。 – trailerman

0

フォームのインスタンスをリストに格納し、新しいフォームを開く前に対応するインスタンスを見つけることが1つの方法です(他のすべてが継承している "基本フォーム"顧客番号の場合)。

フォームが閉じられているときにリストアイテムが削除されていることを確認する必要があります。

必要に応じて、ここで擬似コードを提供することができます。

0

私が推測したように、同じフォームを複数回開く必要がありますが、同じ顧客情報を2回表示する必要はありません。そうであれば、顧客の詳細フォーム(顧客IDのリストなど)に顧客の静的リストを作成し、新しいインスタンスをチェックすることもできます。顧客が静的リストに存在する場合は、既に開かれている詳細フォームの表示またはフォーカスを取り消すことができます(もちろんフォームハンドルを保存する場合)。

1

IDictionary<Customer, Form>をどこかに保存できます。 dictはもちろん地元のではないでしょう、またcustを次のようになります。

var dict = new Dictionary<Customer, Form>(); 
var cust = new Customer(); 

if(!dict.ContainsKey(cust) || dict[cust].IsDisposed) 
{ 
    dict[cust] = new Form1(); 
} 

dict[cust].Show(); 
dict[cust].Activate(); 

このサンプルでは、​​少し短縮されます。これは簡単で、O(1)の検索を行うことができますでしょう。インスタンスフィールドとパラメータになります。

0

その他のオプションは、MDIフォームを使用することです。メインのMDIフォームの子として、すべてのフォームを開きます。新しいフォームを開いている間は、それが既に存在するかどうかを常に確認することができます。

詳細はthisの記事をご覧ください。

これが役に立ちます。

利点:すでに開いているインスタンスのリストを個別に管理する必要はありません。

関連する問題