C#和Modal Windows

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#和Modal Windows相关的知识,希望对你有一定的参考价值。

我有以下情况:一些数据完成的主窗口,它也是一个按钮,打开一个新的模态窗口,您选择产品和产品范围,我单击确定,然后转到下一个屏幕,其中选择数量,价格,并在我点击确定的数据批准后,我想访问主窗口中模态窗口中选择的数据,因为它可以使用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上输入的数据(这比在表单上公开控件更好,因为这意味着您可以自由地改变所有这一切,而不必重新编码依赖于它的任何其他形式)。

如果单击ResultOk(无论确认按钮是什么)按钮,您确保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
}

注意:将主窗口作为参数传递给ShowDialogShow会使对话框的主窗口所有者成为对象。这意味着对话框窗口将始终位于主窗口的前面,并且不会在其后面消失。如果最小化主窗口,这也将最小化对话窗口。

以上是关于C#和Modal Windows的主要内容,如果未能解决你的问题,请参考以下文章

C程序存储结构

标签文本在 C++/CLR Windows 窗体上未更改

如何有条件地将 C 代码片段编译到我的 Perl 模块?

如何测量代码片段的调用次数和经过时间

如何优化C ++代码的以下片段 - 卷中的零交叉

Create Custom Modal Dialog Windows For User Input In Oracle Forms