3

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

我的场景:

我正在为我的应用程序使用DockPanel Suite并且我有ParentForm一个NotesFormand BrowserForm(我实际上还有很多BrowserForm类型,但如果我能让它适用于一个,我应该能够让它适用于其他类型)

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

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

我的目标是获取在字符串变量上输入的信息,textBox1NotesForm我们调用它notesTextBrowserForm而无需单击NotesForm我认为是通过TextChanged事件的任何内容。

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

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

父表格

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 种工具用于他们的服务。

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

4

2 回答 2

2

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

一种方法是这样的:

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为每个子表单的构造函数添加一个类型化的参数,以便您可以在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);
    }
}

注意:拥有一个静态类/单例也是一种解决方案,顺便说一句更简单......

于 2013-08-29T05:20:16.700 回答
1

Yes, you need to hook up the TextChanged event in the NotesForm, like this:

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;
    }
}
于 2013-08-29T04:37:22.327 回答