2

親レコードと、選択した親レコードに関連する多くの子レコードを持つリスト スタイル フォームを持つ Windows フォーム アプリケーションがあります。

すなわち。複数の請求書・見積書・連絡書などをお持ちのお客様 など

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

そのため、ユーザーはいつでも複数の請求書/見積書/通信などの詳細フォームを開いている可能性があります。ユーザーは、別の顧客を選択して、詳細フォームを開く同じプロセスを実行することもできます。

私が抱えている問題は、顧客1が選択され、ユーザーが詳細フォームを表示したい場合、開いているすべてのフォームをチェックして、顧客1の詳細フォームが既に開いているかどうかを確認する必要があることです。

私は、この訴訟で何が良い習慣とみなされるのか疑問に思っていました.

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

4

5 に答える 5

1

IDictionary<Customer, Form>どこかに保管できます。これにより、単純な O(1) ルックアップを実行できます。

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();

このサンプルは少し短縮されています:dictもちろん、ローカルではなく、cust. それらはインスタンス フィールドとパラメータになります。

于 2012-04-25T08:32:18.587 に答える
0

1 つのアプローチは、フォーム インスタンスをリストに格納し、新しいフォームを開く前に対応するインスタンスを見つけようとすることです (他のすべてのフォームから継承する「ベース フォーム」があり、顧客番号のプロパティがあると、事態はより簡単になります)。 )。

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

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

于 2012-04-25T08:25:56.983 に答える
0

ご想像のとおり、同じフォームを複数回開く必要がありますが、同じ顧客情報を 2 回表示する必要はありません。その場合、1 つのオプションは、顧客の詳細フォーム (顧客 ID のリストなど) で顧客の静的リストを作成し、新しいインスタンスを確認することです。顧客が静的リストに存在する場合は、表示をキャンセルするか、すでに開いている詳細フォームにフォーカスできます (もちろん、フォーム ハンドルを保存する場合)。

于 2012-04-25T08:27:00.603 に答える
0

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

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

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

于 2012-04-25T08:16:54.337 に答える
0

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

詳細については、この記事をお読みください。

お役に立てれば。

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

于 2012-04-25T08:39:03.570 に答える