C# 从窗体 2 中选择窗体 1 中的文本

本文关键字:窗体 文本 选择 | 更新日期: 2023-09-27 18:36:16

好的,所以我有我的主形式(Form1)和SearchReplace形式。我的SearchReplace窗体包含一个文本框和一个按钮。当按下按钮时,它应该选择文本框中的任何内容 Form1 ,但什么也不做。谁能帮我?没有给我一个错误,只是没有做任何运行时。

搜索替换

    public void button1_Click(object sender, EventArgs e)
    {
        Form1.searchT = textBox1.Text;

        Form1 form1 = new Form1();
        form1.searchText();
        this.Close();
    }

表单 1 搜索文本

    public void searchText() // search function
    {
        if (searchT != null)
        {
            if (textBox1.TextLength > 0)
            {
                if (textBox1.Text.Contains(searchT))
                {
                    textBox1.SelectionStart = textBox1.Text.IndexOf(searchT);
                    textBox1.SelectionLength = searchT.Length;
                }
            }
        }
    }

searchT 是 Form1 中创建的公共字符串,因为当我询问将数据从一个表单传递到另一个表单时,有人告诉我,直接通过Form1而不是使用 form1 对象更容易。

C# 从窗体 2 中选择窗体 1 中的文本

根据您最近的评论,最好在之前隐藏您当前的表单(SearchReplace)调用表单 1。然后在 Form1 也关闭后关闭它。检查我的代码如下:

假设这是您的SearchReplace表单:

public partial class SearchReplace : Form
{
    Form1 form1;
    public SearchReplace()
    {
        InitializeComponent();
    }
    void form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close(); // When form1 is closed then close also SearchReplace form
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form1.searchT = textBox1.Text; // assign textbox1 to searchT
        form1 = new Form1(); // instantiate first
        form1.FormClosed += new FormClosedEventHandler(form1_FormClosed); // When Form1 Close
        form1.searchText(); // Run searchText function
        form1.Show(); // Show Form1
        this.Hide(); // Make SearchReplace form invisible but still in memory
    }
}

您的Form1会像:

public partial class Form1 : Form
{
    public static string searchT; // Static searchT string as per your requirement
    public Form1()
    {
        InitializeComponent();
    }

   public void searchText() // search function
   {
    if (searchT != null)
    {
        if (textBox1.TextLength > 0)
        {
            if (textBox1.Text.Contains(searchT))
            {
                textBox1.SelectionStart = textBox1.Text.IndexOf(searchT);
                textBox1.SelectionLength = searchT.Length;
            }
        }
    }
  }    
}

问题是您在单击按钮时创建了一个全新的Form。你应该能够完成你想要的:

public void button1_Click(object sender, EventArgs e)
{
    Form1.searchT = textBox1.Text;
    searchText(); //Calls this instance's searchText() function
    this.Close();
}

您可能希望searchT设为非静态,否则其值将应用于 Form1 的所有实例。

您可以将对 form1 中文本框的引用传递给表单搜索替换的构造函数。然后使用此引用选择给定的文本。

根据您创建SearchReplace窗体的方式,您可以使用允许您设置拥有窗体的ShowShowDialog方法将Form1指定为所有者,然后不依赖于在 Form1 中设置变量,只需将参数传递给您的函数即可。这样的东西应该适合你。

表格1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public void searchText(string searchT) // search function
    {
        if (searchT != null)
        {
            if (textBox1.TextLength > 0)
            {
                if (textBox1.Text.Contains(searchT))
                {
                    textBox1.Focus(); // put focus to the Textbox so we can see our selection
                    textBox1.SelectionStart = textBox1.Text.IndexOf(searchT);
                    textBox1.SelectionLength = searchT.Length;
                }
            }
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        SearchReplace sr = new SearchReplace(); // Creating your SearchReplace Form
        sr.Show(this);  // Pass the creating form in as the Owner
    }
}

搜索替换表单

public partial class SearchReplace : Form
{
    public SearchReplace()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        ((Form1)this.Owner).searchText(textBox1.Text); //Cast the Owner to Form1 and access the Function 
                                                       //passing in your search Parameter
        this.Close();
    }
}

你的代码没有错,只是你只声明了要选择哪个文本,不要指望它会自动突出显示,我建议你改变背景颜色或选定的文本来突出显示它。试试我的例子。

建议你使用RichTextBox

在您的 Form1 中假设您声明

了一个
public static string searchT;

然后在你的Form1将搜索替换表单显示为Dialog

        private void searchReplaceBtn_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                searchText();
            }
        }

然后在你的SearchReplace Form

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.searchT = textBox1.Text;
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }

终于在你的searchtext Method

        private void searchText()
        {
            if (searchT != null)
            {
                if (textBox1.TextLength > 0)
                {
                    int index = 0;
                    //this will loop through the entire richTextBox
                    while (index < textBox1.Text.LastIndexOf(searchT))
                    {
                        //this will select the text that matches the searchT
                        textBox1.Find(searchT, index, textBox1.TextLength, RichTextBoxFinds.None);
                        //this will change the background color of each of the selected text
                        textBox1.SelectionBackColor = Color.Yellow;
                        //this will continue searching to the end of the text
                        index = textBox1.Text.IndexOf(searchT, index) + 1;
                    }
                }
            }
        }

注意:您不能在文本框中选择多个文本,这就是为什么更改与您的searchT匹配的每个文本的背景颜色将是最佳选择。

希望这对:)有所帮助

您可以通过

使用属性并给出该特定文本框的值来执行此操作。

在您的表单中1:

public static string Text
{
   get { return textbox1.Text; }
}

你可以通过你的其他形式得到它

form1.Text;