【问题标题】:Passing variable between winforms在winforms之间传递变量
【发布时间】:2010-11-22 16:41:24
【问题描述】:

我有一个关于 Windows.Forms 应用程序中的委托的问题。

有两种形式:

  1. 主窗体,其中有一个名为“设置”的按钮。

  2. “设置”表单,这是“子”表单。

当我单击主表单中的“设置”按钮时,它会打开“设置”表单的一个实例。

我的问题是我需要在打开设置表单时将变量传递给它。这样新表单将显示变量文本。我不知道如何检索子“设置”表单中的信息。我是通过在线教程完成的,但无法从教程中了解如何阅读目标表单中的信息。

这是我到目前为止所做的,主窗体中的代码:

public partial class MainForm : Form
{

    /// <summary>
    /// delegate to send data between forms
    /// </summary>
    public delegate void PageInfoHandler(object sender, PageInfoEventArgs e);
    /// <summary>
    /// event of the delegate
    /// </summary>
    public event PageInfoHandler PageInfoRetrieved;

    //other stuff, events blabla

    private void toolStripBtnSettings_Click(object sender, EventArgs e)
    {
        PageInfoEventArgs args = new PageInfoEventArgs(SomeString);
        this.OnPageInfoRetrieved(args);

        SettingsForm settingsForm = new SettingsForm();
        settingsForm.ShowDialog();  
    }

    private void OnPageInfoRetrieved(PageInfoEventArgs args)
    {
        if (PageInfoRetrieved != null)
            PageInfoRetrieved(this, args);
    }
}

【问题讨论】:

    标签: c# .net winforms delegates


    【解决方案1】:

    将您想要的任何信息传递给设置表单的构造函数,并为您需要的东西提供访问器方法。

    public class SettingsForm : WinForm
    {
        private string m_Data;
        private int m_nExample = 0;
    
        // ctor
        public SettingsForm(string _data)
        {
            m_Data = data;  // you can now use this in SettingsForm
        } // eo ctor
    
        public int Example {get{return(m_nExample);} }
    } // eo class SettingsForm
    

    在上面的“示例”中,您可以使用字符串构造一个 SettingForm 并获取它可能使用的整数。在您的代码中:

    private void toolStripBtnSettings_Click(object sender, EventArgs e)
    {
        PageInfoEventArgs args = new PageInfoEventArgs(SomeString);
        this.OnPageInfoRetrieved(args);
    
        SettingsForm settingsForm = new SettingsForm("some data to pass");
        settingsForm.ShowDialog();  
    
        int result = settingsForm.Example; // retrieve integer that SettingsForm used
    }
    

    【讨论】:

      【解决方案2】:

      设置表单是一个类。它现在是你的了,你可以用它做你喜欢的事。因此,向其构造函数添加一个参数(或任何你想要的参数)。然后在您的 MainForm 中调用 SettingsForm(whatever),一切就绪。

      【讨论】:

      • 这就是我要做的。然后,如果您需要从子表单中获取信息,请使用您的父类可以访问的 get 方法创建一个属性。 IDK 您从哪里获得该教程,但它的出路
      • 非常感谢,解决了。只是好奇,是否也可以使用代表?我知道对于这个简单的问题使用委托太多了,但我只是想知道这些是否也可以。
      • 是的,您可以传入实际值,或者您可以传入对 MainForm 的引用并将属性添加到 MainForm 以供 SettingsForm 调用,或者您可以传入一个委托以供 SettingsForm 调用,如果有时您希望它调用不同的方法来获取值。不过,最后一个会很奇怪。似乎是一个尝试展示代表在行动中的借口。
      【解决方案3】:

      我建议向 SettingsForm 添加一个属性。

      然后,这样称呼它:

      SettingsForm settingsForm = new SettingsForm(); 
      settingform.myProperty = myPropertyvalue;
      settingsForm.ShowDialog();   
      

      【讨论】:

        【解决方案4】:

        为什么不向你的设置表单添加一个构造函数,它接受参数并在那里传递你需要的任何数据?

        【讨论】:

          【解决方案5】:

          您可以为接受文本的设置表单创建参数化构造函数,并将其设置为表单中的属性

          public partial class SettingsForm : Form
          {
          
             public string DisplayText {get;set;}
          
             public SettingsForm(string text)
             {
                  DisplayText = text;
             }
          }
          

          然后,您只需像这样(从您的主窗体)初始化设置

          var settingsForm = new SettingsForm("my init text");
          

          您的设置表单将被正确初始化,并且您可以在 DisplayText 属性中使用所需的文本

          【讨论】:

            猜你喜欢
            • 2016-12-03
            • 2015-04-03
            • 2022-09-29
            • 2011-03-05
            • 2013-10-30
            • 2018-03-07
            • 2020-07-02
            • 1970-01-01
            相关资源
            最近更新 更多