将信息从打开的表单传递给TextChanged事件中的打开表单

问题描述:

我仍然在学习C#,所以如果这是一个愚蠢的问题,并且还原谅了长篇文章,因为我不确定如何说另外那么“很长的路要走。将信息从打开的表单传递给TextChanged事件中的打开表单

我的情景:

我使用DockPanel Suite我的申请,我有一个ParentForm一个NotesFormBrowserForm(其实我有不少更多BrowserForm类型的,但如果我能得到它的工作到一个我应该能够使它工作的其他人)

所以ParentForm负载在应用程序启动和加载时,它加载了NotesFormBrowserForm通过一个按钮单击事件被加载从ParentForm,然后该实例是开放和住宿开放并且不会关闭。

因此,当我输入信息到NotesForm我已经有一个建立实例所有3种形式。 (我认为是问题)

我的目标是获得了在textBox1上键入NotesForm给一个字符串变量的信息让我们称之为它的BrowserFormnotesText,而无需点击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; 
    } 

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

} 

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

还有一些我的应用程序的背景。我将其用于访问我们Intranet中的各种工具。它会自动记录您将它们合并到一个应用程序中,而不是打开40 - 80个不同的浏览器窗口,并最终(希望)自动从这些工具中获取一些信息,因此我们不必搜索该页面。该工具将自动将其拉出。这不是恶意的,我不是垃圾邮件发送者或任何我为10个不同的公司提供ISP技术支持的服务,每个公司都有8-10个工具供他们的服务使用。

任何与此有关的援助将不胜感激,或者如果有更简单的方法去了解我在做什么,我也很乐意听到。此外,如果你想看到我的整个代码(如果有帮助)让我知道,我不介意发布它只是非常麻烦。

+1

文本的圣墙本阿弗莱克 – Jonesopolis

+0

@Jonesy哈哈我知道对不起可能是因为杀人,但更好的是那些烦人的简短的毫无意义的问题。 – Nabbic

我不知道,如果有你的问题的权利。我假设你想将信息从一个孩子形式传递给另一个孩子。

这样做会是这样的一种方法:

1.创建一个像这样的接口:

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

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

public partial class parentForm : Form, IDataContainer 

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

在你的情况SetData方法的实现将作为一个桥梁,conecting的notesFormBrowserForm,窗体之间传递数据,在干净的方式

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

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

3.添加一个参数键入IDataContainer到每个子构造函数的构造函数,以便您可以传递参考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); 
    } 
} 

注:有一个静态类/ 也将是一个解决方案,并通过这种方式简单得多...

+0

这太好了。这正是我一直在为我的程序寻找的一种东西。当你需要传递很多不同的表单时,使用属性有点脏,而且所有不同的实例都让我头疼。过去我尝试过这样做,但我无法正常工作。非常感谢我今晚会尝试实施这个! – Nabbic

+0

很高兴听到它;)让我们知道,如果它的执行情况良好。 –

+1

啊哈它工作!太好了,谢谢!!现在基本上用这种方式重写所有内容lol。将是乏味的,但更清洁,更容易理解代码 – Nabbic

是的,你需要连接的TextChanged事件在NotesForm,就像这样:

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

@ Karl 我相信这就是我一直在寻找的东西(没有太多的事件经验)谢谢! 我将如何通过构造函数传递它? – Nabbic