在TextChanged事件上将信息从打开的表单传递到打开的表单

时间:2013-08-29 04:20:29

标签: c# winforms events

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

我的情景:

我正在使用DockPanel Suite申请,我有一个ParentForm一个NotesFormBrowserForm(我实际上还有更多BrowserForm类型,但如果我能使它工作,我应该能够使其工作到其他人)

因此ParentForm会在应用程序启动时加载,加载时会加载NotesForm并通过BrowserForm中的按钮点击事件加载ParentForm,然后实例打开并保持打开状态,不会关闭。

所以当我将信息输入NotesForm时,我已经建立了一个实例,所有3个表格。 (我认为这就是问题)

我的目标是将textBox1 NotesForm上输入的信息输入到字符串变量,然后在notesText上调用BrowserForm,而不必点击任何内容我假设的NotesForm将通过TextChanged事件。

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

我包含了一种愚蠢的代码,以显示我目前是如何做到的。我的完整代码非常庞大,所以只是试图避免混淆并展示我的目标。

  

父表格

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;
    }
  

NotesForm

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

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

}
  

BrowserForm

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);
    }
    }

}

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

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

对此的任何帮助都会受到赞赏,或者如果有更简单的方式来处理我正在做的事情,我也会很高兴听到。此外,如果你想看到我的整个代码(如果它有帮助)让我知道,我不介意发布它只是非常麻烦。

2 个答案:

答案 0 :(得分:2)

我不确定你的问题是否合适。我假设您想将信息从一个子表单传递到另一个子表单。

这样做的一种方式是:

<强> 1。创建一个这样的界面:

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

<强> 2。让您的parentForm实现您的界面:

public partial class parentForm : Form, IDataContainer

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

在您的情况下,SetData方法的实现将充当桥梁,将notesFormBrowserForm相结合,以干净的方式在表单之间传递数据

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

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

第3。将类型为IDataContainer的参数添加到每个子窗体 的构造函数中,以便您可以将引用传递给IDataContainer实现(这将是您的{{ 1}})。这样:

parentForm

<强> 4。最后,在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); } ,设置逻辑以设置notesForm中的数据:

container

注意:拥有静态类/ 单身也是一种解决方案,顺便说一下就简单了......

答案 1 :(得分:1)

是的,您需要在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;
    }
}