我还在学习C#所以请原谅我,如果这是一个愚蠢的问题,也请原谅我的长篇文章,因为我不确定如何说这个“长”的方式。
我的情景:
我正在使用DockPanel Suite申请,我有一个ParentForm
一个NotesForm
和BrowserForm
(我实际上还有更多BrowserForm
类型,但如果我能使它工作,我应该能够使其工作到其他人)
因此ParentForm
会在应用程序启动时加载,加载时会加载NotesForm
并通过BrowserForm
中的按钮点击事件加载ParentForm
,然后实例打开并保持打开状态,不会关闭。
所以当我将信息输入NotesForm
时,我已经建立了一个实例,所有3个表格。 (我认为这就是问题)
我的目标是将textBox1
NotesForm
上输入的信息输入到字符串变量,然后在notesText
上调用BrowserForm
,而不必点击任何内容我假设的NotesForm
将通过TextChanged
事件。
我目前能够使用属性(获取,设置)将信息传递到表单,但我必须单击NotesForm
和BrowserForm
上的按钮才能实现。< / 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个服务工具。
对此的任何帮助都会受到赞赏,或者如果有更简单的方式来处理我正在做的事情,我也会很高兴听到。此外,如果你想看到我的整个代码(如果它有帮助)让我知道,我不介意发布它只是非常麻烦。
答案 0 :(得分: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
实现(这将是您的{{ 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;
}
}