我想要做的是一个与VS或Notepad ++完全相同的搜索窗口,其中两个窗口都处于活动状态(因为FindBox显示为Show not ShowDialog),当你在FindBox中按find时,父进行搜索。这是一个例子:
class MainForm : Form
{
public void FindNext(string find)
{
// Do stuff
}
public void OpenFindWindow()
{
FindBox find = new FindBox();
find.customParent = this;
find.Show();
}
}
class FindBox : Form
{
public customParent;
public void FindButtonPressed()
{
((MainForm)customParent).FindNext(textBox1.text);
}
}
但似乎很奇怪我必须手动设置这个新字段“customParent”。做这样的事情的官方方式是什么?
答案 0 :(得分:2)
您可以在构造函数中接受customParent作为参数,或者更好的是,FindBox
表单应该在按下查找按钮后调用Action<string>
。
class MainForm : Form
{
public void FindNext(string find)
{
// Do stuff
}
public void OpenFindWindow()
{
FindBox find = new FindBox(this.FindNext);
find.Show();
}
}
class FindBox : Form
{
private Action<string> callback;
public FindBox(Action<string> callback)
{
this.callback = callback;
}
public void FindButtonPressed()
{
callback(textBox1.text);
}
}
答案 1 :(得分:1)
您可以使用所有者表单 - 使用接受所有者表单的Show overload。然后使用Form.Owner属性来获取对所有者表单的引用。您需要将所有者表单设置为特定的表单类型以创建紧耦合(但当然,您可以引入一个接口来放松它)。
答案 2 :(得分:1)
您可以使用
find.Show(this);
并使用Owner
的{{1}}属性访问父表单。当然,在这种情况下你必须将其强制转换为find
:
MainForm
这种方法还有一个优点,即主表单无法隐藏查找框(所有表单将始终显示在其所有者之上,即使所有者具有焦点...)