C# 如何使用子窗口在父窗口中搜索文本框内容?

C# 如何使用子窗口在父窗口中搜索文本框内容?,c#,winforms,C#,Winforms,嗨,我正在尝试创建一个类似于windows记事本的记事本。 我陷入了这样的境地:我想在“查找”框中查找搜索到的文本(就像我们在记事本中所做的那样),并在父窗口中显示选定的文本,父窗口中有一个包含所有文本的文本框 我尝试将该方法设置为静态,以访问父窗口中的搜索文本。 下面是代码: namespace NotePadApp { public partial class Find : Form { static string SearchText=""; static Find

嗨,我正在尝试创建一个类似于windows记事本的记事本。 我陷入了这样的境地:我想在“查找”框中查找搜索到的文本(就像我们在记事本中所做的那样),并在父窗口中显示选定的文本,父窗口中有一个包含所有文本的文本框

我尝试将该方法设置为静态,以访问父窗口中的搜索文本。 下面是代码:

 namespace NotePadApp
 {
public partial class Find : Form
{

    static string SearchText="";
    static Find Findbox;

 static Find Findbox;


    public static string GetSearchText()
    {
        Findbox = new Find();
        Findbox.ShowDialog();
        return SearchText;

    }

  }}
我能够访问静态方法GetSearchText()


但只有当我关闭“查找(子)”窗口时,才会搜索文本

因此,我想使用用户搜索父窗口中内容的窗口打开子窗口。

如果您试图读取或写入控件,请将主窗口中的内容控件(Textbox或其他任何内容)包装在公共属性中,或者如果您需要执行其他操作,请使用公共方法。您可以在主窗体上使用一个公共方法,例如将搜索条件作为参数

您可以使用查找表单中的
Application.OpenForms
访问主表单

例如,假设
Form1
是您的主表单,您给它一个名为
MyTextArea

在您的查找表上,您可以这样做

var mainForm = (Form1)Application.OpenForms["Form1"];
然后,您可以使用访问主窗体上的控件

mainForm.MyTextArea ....

让事情保持静止很少是处理事情的正确方式。您需要考虑将findbox结果作为一个显示表单并将结果返回到父窗口的方法来获取

为“FindBox”对话框提供一些公共属性(
FindText
和/或
ReplaceText
),以存储用户的输入(用户单击“确定”按钮时可以设置这些属性,如
FindText=findTextBox.Text
),并编写父窗体可以访问的方法:

DialogResult FindTextInEditor(out string findText)
{
    // instantiate the FindForm and display it with .ShowDialog()
    var findForm = new FindBox();
    var result = findForm.ShowDialog();

    // set the out parameter using the public properties of the FindBox:
    findText = findForm.FindText;

    // if the user cancelled out the caller needs to know:
    return result;
}
父/主窗体只需调用此方法即可显示“查找框”并返回结果-可能如下所示:

string findText;
var result = FindTextInEditor(out findText);

if (result != DialogResult.Cancel)
{
    // search the text editor content for "findText"
}

为什么不在ctor中为该表单提供文本框?或者在调用show对话框之前实例化它之后将其设置为字段?或者我误解了您的意思?我希望搜索通过childwindow中的文本框反映在parentwindow中的文本框上。就像windows记事本一样。因此,传递构造函数不会在父窗口的当前实例上反映实时更改,我想是这样还是我错了?我正在尝试父子关系,让我通过将当前父实例传递给子实例来查看是否有效。“但只有在我关闭“查找(子)”窗口时,才会搜索文本。”然后使用Show()而不是ShowDialog()。正如@James所指出的,您还需要一个对“家长”表单的引用,这样您就可以使用它了。非常感谢您。。几天前,我看到一个堆栈问题,这也是show()和ShowDialog()不同的原因。但到了运用这些知识的时候,我真是糟透了。你好,你提到的方法真的很好。但是如何在不关闭子窗体的情况下传递信息。下面是我挣扎的场景:1。当用户在Find(child)表单中单击Find Text时,应该在父窗口中选择文本。2.注意力应该回到父母身上。3.如果用户再次尝试搜索,则应发生相同的情况(1和2)4。用户可以关闭“查找”窗口,焦点应回到父窗口。就像记事本一样。你需要关于选择文本而不是控制父窗体的实际方法的帮助吗?我使用了你的技术来完成关系,最后让我到达终点。很好。很好,你搞定了