C#创建Notepad ++,如搜索框

时间:2011-01-14 03:23:12

标签: c# winforms forms find

我想要做的是一个与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”。做这样的事情的官方方式是什么?

3 个答案:

答案 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

这种方法还有一个优点,即主表单无法隐藏查找框(所有表单将始终显示在其所有者之上,即使所有者具有焦点...)