次のような状況があります: データの一部が完成したメイン ウィンドウは、製品と製品の範囲を選択する新しいモーダル ウィンドウを開くボタンでもあります。[OK] をクリックして次の画面に進みます。数量、価格を選択し、[OK] をクリックしてデータを承認したら、メイン ウィンドウのモーダル ウィンドウで選択したデータにアクセスしたいと思います。
4 に答える
You can do something that looks more or less like this:
private void button1_Click(object sender, EventArgs e)
{
Form2 firstPopup = new Form2();
firstPopup.ShowDialog();
var someData = firstPopup.SomeValue;
Form2 secondPopup = new Form2();
secondPopup.ShowDialog();
var someOtherData = secondPopup.SomeValue;
doSomeStuff(someData, someOtherData);
}
In this case SomeValue
is a property on the form with a public getter and a private setter. It's value will be set sometime before the form is closed. You can have any number of such properties per form, and any number of forms.
This is similar to the way that Open, Save As and Folder dialogs work. Take for example the Open File Dialog, once you click OK, you have access to the file that was selected
Suggestion:
In your modal window, set some public properties which hold your data. Set your OK button to set the forms DialogResult to OK, in your parent form you can do the following test (in this instance, DataModel is the data you are trying to access)
if(modalWindow.DialogResult == DialogResult.OK)
{
this.DataModel = modalWindow.DataModel;
}
Here is some information on how to use DialogResult http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx
モーダル ウィンドウを使用しないでください。
電話すれば
var dialog = new DialogWindow();
If (dialog.ShowDialog(mainWindow) == DialogResult.OK) {
use the result of the dialog window
}
ダイアログ ウィンドウはモーダルになります。つまり、開いている間は他のウィンドウにアクセスできません。
次のコードでは、両方のウィンドウに同時にアクセスできます。ただし、問題は、ダイアログの実行中にメイン ウィンドウのコードが一時停止されないことです。
var dialog = new DialogWindow();
dialog.Show(mainWindow);
You cannot use the result of the dialog window here!
したがって、ダイアログの完了をメイン ウィンドウに伝える方法が必要です。この目的のために、ダイアログウィンドウでイベントを作成することをお勧めします
public class ProductResultEventArgs : EventArgs
{
public ProductResultEventArgs(List<Product> products)
{
Products = products;
}
public List<Product> Products { get; private set; }
}
ダイアログウィンドウで
public event EventHandler<ProductResultEventArgs> ProductsChosen;
private void OnProductsChosen(List<Product> products)
{
var eh = ProductsChosen;
if (eh != null) {
eh(this, new ProductResultEventArgs(products));
}
}
private BtnOk_Click(object sender, EventArgs e)
{
OnProductsChosen(somehow get the product list);
}
メインウィンドウでは、次のようなことができます
var dialog = new DialogWindow();
dialog.ProcuctsChosen += Dialog_ProductsChosen
dialog.Show(mainWindow);
そしてハンドラーを作成します
private Dialog_ProductsChosen(object sender, ProductResultEventArgs e)
{
use e.Products here
}
注: メイン ウィンドウをパラメーターとしてShowDialog
orに渡すと、メイン ウィンドウShow
がダイアログの所有者になります。これは、ダイアログ ウィンドウが常にメイン ウィンドウの前面に表示され、その後ろに隠れることがないことを意味します。メイン ウィンドウを最小化すると、ダイアログ ウィンドウも最小化されます。
通常、モーダル ウィンドウでは、OpenFileDialog で使用されるものと同様のパターンに従います。ここでは、次のようなことを行います。
public class MyDialog : Form
{
public MyResult Result { get { /* code elided */ } }
}
つまり、モーダル フォームのコードを持つことに加えてResult
、フォームの UI に入力されたデータを提供できる特定の型のパブリック プロパティも公開します (これは、自由に変更できることを意味するため、フォームのコントロールを公開するよりも優れています)。それに依存する他のフォームを再コーディングする必要はありません)。
または(確認ボタンが何であれ) ボタンがクリックされた場合に、が利用可能で有効Result
であることが保証されていることを確認します。次に、それに応じてフォームの を設定したことを確認します(各ボタンにも 1 つを割り当てることができます。たとえば、キャンセル ボタンなど)。Ok
Yes
DialogResult
DialogResult.Cancel
次に、フォームを開くと、次のようになります。
var form1 = new MyDialog();
if(form1.ShowDialog() != DialogResult.OK)
return; //abort the operation, the user cancelled/closed the first modal
MyResult form1Data = form1.Result; //get your actual data from that modal form.
//...and then on with your second modal
したがって、進行中にモーダルからデータを収集し、キャンセルされた場合は中止します。