【问题标题】:Passing information from an open form to an open form on TextChanged event在 TextChanged 事件中将信息从打开的表单传递到打开的表单
【发布时间】:2013-08-29 04:20:28
【问题描述】:

我仍在学习 C#,如果这是一个愚蠢的问题,请原谅我,也请原谅我的长篇文章,因为我不确定如何说这个,而不是“长”的方式。

我的场景:

我在我的应用程序中使用DockPanel Suite,并且我有一个ParentFormNotesFormBrowserForm(我实际上还有很多BrowserForm 类型,但如果我可以让它工作到一个我应该能够使它对其他人起作用)

所以ParentForm 在应用程序启动时加载,当它加载时加载NotesFormBrowserForm 通过来自ParentForm 的按钮单击事件加载,然后该实例打开并保持打开状态并将没有关闭。

所以当我在NotesForm 中输入信息时,我已经建立了所有 3 种形式的实例。 (我认为这就是问题所在)

我的目标是获取在NotesForm 上输入textBox1 的信息到一个字符串变量,让我们在BrowserForm 上调用它notesText,而无需单击NotesForm 上的任何内容,我会假设将通过TextChanged 事件。

我目前能够使用属性(获取、设置)将信息传递到表单,但我必须单击 NotesFormBrowserForm 上的按钮才能实现。

我包含了一种简化的代码来展示我现在是如何做到的。我的完整代码非常大,所以只是想避免混淆并展示我正在做的事情的概念。

父表单

public partial class parentForm : Form
{
    private notesForm notesForm = new notesForm();
    public parentForm()
    {
        InitializeComponent();

    }
    private void parentForm_Load(object sender, EventArgs e)
    {
        notesForm.Show(mainDock, DockState.DockLeft);

    }
    private void tb1_Click(object sender, EventArgs e)
    {
        BrowserForm.notesText= notesForm.passInfo;
    }

笔记表格

public partial class notesForm : DockContent
{
    private string _passInfo;
    public notesForm()
    {
        InitializeComponent();

    }
    public string passInfo
    {
        get { return textBox1.Text; }
        set
        {
            _passInfo = value;
            textBox1.Text = _passInfo;
        }
    }

}

浏览器表单

public partial class BrowserForm : DockContent
{
    private string passInfo;
    public BrowserForm()
    {
        InitializeComponent();

    }
            public string passInfo
    {
        get
        {
            return _passInfo;
        }
        set
        {
            _passInfo = value;
            notesText = _passInfo;
        }

    }
    string notesText;
    private void button1_Click(object sender, EventArgs e)
    {
    MessageBox.Show(notesText);
    }
    }

}

所以这目前有效,但要使其正常工作,我必须单击父窗体上的按钮,然后单击浏览器窗体上的按钮。理想情况下,在您在便笺表单的文本框中输入完信息后,我需要它将该信息传递给浏览器表单。如果有帮助,输入到文本框中的信息是静态的,并且总是 9 个字符长并且由数字(电话号码)组成。

还有我的应用程序的一些背景知识。我在工作中使用它来访问我们内部网中的各种工具。它会自动让您登录,将它们整合到一个应用程序中,而不是打开 40 到 80 个不同的浏览器窗口,并且最终(希望)会自动从这些工具中抓取一些信息,这样我们就不必在页面上搜索它了。该工具会自动拉动它。这没有恶意,我也不是垃圾邮件发送者,也不是我为 10 家不同公司提供技术支持的 ISP 技术支持,每家公司都有 8-10 种工具用于他们的服务。

对此的任何帮助将不胜感激,或者如果有更简单的方法来处理我正在做的事情,我也很乐意听到。另外,如果您想查看我的整个代码(如果有帮助),请告诉我,我不介意发布它,这非常麻烦。

【问题讨论】:

  • 文字本·阿弗莱克的圣墙
  • @Jonesy 大声笑我知道很抱歉可能杀了但比那些没有意义的烦人的简短问题更好。

标签: c# winforms events


【解决方案1】:

我不确定你的问题是否正确。我假设您想将信息从一个子窗体传递到另一个子窗体。

一种方法是这样的:

1.创建这样的界面:

public interface IDataContainer
{
     void SetData(String data);
}

2。让你的parentForm 实现你的接口:

public partial class parentForm : Form, IDataContainer

并在表单类中给方法一个实现。这个简单的接口将使实现者能够为任何目的存储(字符串)数据。

在您的情况下,SetData 方法的实现将充当桥梁,将notesForm 连接到您的BrowserForm,以干净的方式在表单之间传递数据

public partial class parentForm : Form, IDataContainer
[...]

public void SetData(String dataComingFromOtherSource)
{
     this.browserFormInstance.passInfo = dataComingFromOtherSource;
}
[...]

3.将类型为 IDataContainer 的参数添加到每个 child-form 的构造函数中,以便您可以在 IDataContainer 实现中传递对的引用(这将是您的 parentForm)。这样:

public partial class parentForm : Form
{
    private notesForm notesForm = null;

    public parentForm()
    {
        InitializeComponent();

        // Note that at this point you are instantiating
        // the child-form and you are passing a reference
        // to the `parentForm` so that you can pass information
        // to it, and from it to whatever other form you may
        // need, in an elegant way.
        this.notesForm = new notesForm(this);
    }

4.最后,在notesForm,把设置数据的逻辑放到你的container

public partial class notesForm : DockContent
{
    // On runtime this will in fact the `parentForm` object instance.
    IDataContainer myDataContainerInstance = null;

    public notesForm(IDataContainer myDataContainerInstance) : base()
    {
        InitializeComponent();

        // Assign the reference so that you can use it later
        this.myDataContainerInstance = myDataContainerInstance;

        textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        this.myDataContainerInstance.SetData(textBox1.Text);
    }
}

注意:拥有一个静态类/singleton 也是一种解决方案,而且更简单...

【讨论】:

  • 这很棒。这正是我一直在为我的程序寻找的东西类型。当您需要传递这么多不同的表单并且所有不同的实例都让我头疼时,使用属性有点脏。我过去曾尝试过这样做,但无法使其正常工作。非常感谢,我今晚会尝试实现它!
  • 很高兴听到它 ;) 让我们知道实施是否顺利。
  • 啊哈成功了!!太好了,谢谢!!现在基本上以这种方式重写所有内容,哈哈。会很乏味,但更简洁,更容易理解代码中发生的事情
  • 工作得很好,但是如果我想在以后添加另一个文本框怎么办?
  • 在这种情况下,为了以相同的机制支持 控制器(您的 parentForm)中的不同行为,您可以将方法 SetData 的签名更改为接受一个自定义类,比如说MyInterchangeData。在该类中,您可以添加两个属性,一个是数据本身(Object data),另一个可能是新的Enum 类型(您需要声明),假设我们将其命名为KindOfDataEnum,和字段KindOfDataEnum kindOfDataparentForm 将决定在收到不同的 KindOfDataEnum 值后做什么。基本机制将是相同的。
【解决方案2】:

是的,您需要在 NotesForm 中连接TextChanged 事件,如下所示:

public partial class notesForm : DockContent
{
    public notesForm()
    {
        InitializeComponent();
        textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        // Get value of text box here and either pass it to the Browser form 
        // via its constructor or get an instance of the Browser form and use 
        // the set of a property in the Browser form to store the value 
        string theTextBoxValue = textBox1.Text;
    }
}

【讨论】:

  • @Karl 我相信这就是我想要的(没有太多的活动经验)谢谢!我将如何通过构造函数传递它?
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2015-08-12
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多