我有以下情况:一些数据完成的主窗口,它也是一个按钮,打开一个新的模式窗口,您可以在其中选择产品和产品范围,我单击确定并进入下一个屏幕,其中选择数量,价格,并在我点击确定的数据批准后,我想访问主窗口中模式窗口中选择的数据,因为它可以使用 C# 来完成?
4 回答
你可以做一些看起来或多或少像这样的事情:
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
,表单上的属性具有公共 getter 和私有 setter。它的值将在表单关闭之前的某个时间设置。您可以在每个表单中拥有任意数量的此类属性,以及任意数量的表单。
这类似于“打开”、“另存为”和“文件夹”对话框的工作方式。以打开文件对话框为例,一旦您单击确定,您就可以访问被选中的文件
建议:
在您的模态窗口中,设置一些保存数据的公共属性。设置 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
使主窗口成为对话框的所有者。这意味着对话窗口将始终停留在主窗口的前面,而不会消失在主窗口后面。如果您最小化主窗口,这也会最小化对话窗口。