我有以下情况:一些数据完成的主窗口,它也是一个按钮,打开一个新的模态窗口,您选择产品和产品范围,我单击确定,然后转到下一个屏幕,其中选择数量,价格,并在我点击确定的数据批准后,我想访问主窗口中模态窗口中选择的数据,因为它可以使用C#完成?
你可以做一些看起来或多或少的事情:
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);
}
在这种情况下,SomeValue
是一个带有公共吸气剂和私人安装者的表格上的财产。它的值将在表单关闭之前的某个时间设置。每个表单和任意数量的表单都可以包含任意数量的此类属性。
这类似于“打开”,“另存为”和“文件夹”对话框的工作方式。以打开文件对话框为例,单击“确定”后,您可以访问所选的文件
建议:
在模态窗口中,设置一些保存数据的公共属性。设置OK按钮将表单DialogResult设置为OK,在父表单中,您可以执行以下测试(在此实例中,DataModel是您尝试访问的数据)
if(modalWindow.DialogResult == DialogResult.OK)
{
this.DataModel = modalWindow.DataModel;
}
以下是有关如何使用DialogResult http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx的一些信息
通常使用模态窗口,您遵循与OpenFileDialog使用的模式类似的模式,您可以在其中执行以下操作:
public class MyDialog : Form
{
public MyResult Result { get { /* code elided */ } }
}
即,除了具有模态形式的代码之外 - 您还公开了给定类型的公共Result
属性,该属性可以提供在该表单的UI上输入的数据(这比在表单上公开控件更好,因为这意味着您可以自由地改变所有这一切,而不必重新编码依赖于它的任何其他形式)。
如果单击Result
或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
因此,您在进行过程中从模态中收集数据,如果取消则中止。
尽量不要使用模态窗口!
如果你打电话
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
或Show
会使对话框的主窗口所有者成为对象。这意味着对话框窗口将始终位于主窗口的前面,并且不会在其后面消失。如果最小化主窗口,这也将最小化对话窗口。