【问题标题】:Best way to handle passing of Control.Checked state between forms处理表单之间传递 Control.Checked 状态的最佳方式
【发布时间】:2012-10-19 23:11:25
【问题描述】:

我已经有一段时间没有使用 Windows 窗体应用程序了。我在主窗体上有一个复选框,并且根据特定条件,如果需要打开第二个窗体以向用户请求其他数据,我应该如何将消息从第二个传递(或获取)回主窗体表格,以便我可以判断是否可以选中或取消选中复选框?

据我所知,我可以使用像 Pass by ref 这样的东西。或者有没有更好的方法来做到这一点?

【问题讨论】:

  • 我不确定我是否理解你的情况,但我不认为通过 ref 传递是这里的解决方案。首先打开什么表格?一种形式是另一种形式的父母吗?你想什么时候传递值?
  • 你检查those了吗?
  • 您可能想查看 Form.ShowDialog 方法(参见此处的示例:msdn.microsoft.com/en-us/library/c7ykbedk%28v=vs.100%29.aspx
  • @Munchies 谢谢,但我的问题不是如何显示对话框。
  • 将属性添加到第二个表单并在您调用 showdialog 的表单实例上检查它。

标签: c# .net winforms


【解决方案1】:

由于您将子窗体显示为对话框,而父窗体在窗体关闭之前不需要它,您需要做的就是向子窗体添加一个带有公共 getter 和私有 setter 的属性,在适当的时候在子窗体中设置值,然后在调用ShowDialog 后从主窗体中读取值。

【讨论】:

    【解决方案2】:

    一种方法是使用事件。

    在您的子表单中,声明一个在特定用户交互时引发的事件,然后在您的主表单中简单地“订阅”该事件。

    当您实例化并调用您的子表单时,您会这样做:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2();
        frm.MyEvent += frm_MyEvent;
        frm.ShowDialog();
        frm.MyEvent -= frm_MyEvent;
    }
    
    private void frm_MyEvent(object sender, EventArgs e)
    {
        textBox1.Text = "whatever"; //just for demo purposes
    }
    

    在您的子表单中,您声明事件并引发它:

    public event EventHandler MyEvent;
    
    private void button1_Click(object sender, EventArgs e)
    {
        if (MyEvent!= null)
            MyEvent(this, EventArgs.Empty);
    }
    

    希望对你有帮助

    【讨论】:

    • 有趣的方法。谢谢!
    • @James:请注意,在我的示例中,我使用了 EventArgs.Empty,但您可以使用带有值的“真实”EventArg 传递回您的主表单。
    • 做这一切的意义何在?事件的意义在于允许某些代码在未来不确定的时间点执行(从订阅者的角度来看),但订阅者知道何时需要执行代码。如果您使用 模式对话框,这本质上是您需要遵循的模型,但对于模式对话框,这只是不必要的努力。
    • 我的解决方案可以应用于更广泛的问题,而不仅仅是需要从模式对话框中读取值的问题。
    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多