0

我正在尝试为我的程序查找下一个函数,我确实设法用这段代码完成了:

 int findPos = 0;
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            string s = textBox1.Text;
            richTextBox1.Focus();
            findPos = richTextBox1.Find(s, findPos, RichTextBoxFinds.None);
            richTextBox1.Select(findPos, s.Length);
            findPos += textBox1.Text.Length;
            //i = richTextBox1.Find(s, i + s.Length, RichTextBoxFinds.None);
        }
        catch
        {
            MessageBox.Show("No Occurences Found");
            findPos = 0;
        }
    }

它在 form1 中工作得很好,但是如果我使用这段代码并尝试从 form2 调用它,它不会做任何事情:

  //Form1
  public void FindNext()
    {
        try
        {
            this.Focus();
            Form2 frm2 = new Form2();
            string s = frm2.textBox1.Text;
            richTextBox1.Focus();
            findPos = richTextBox1.Find(s, findPos, RichTextBoxFinds.None);
            richTextBox1.Select(findPos + 1, s.Length);
            findPos += textBox1.Text.Length;
        }
        catch
        {
            MessageBox.Show("No Occurences Found");
            findPos = 0;
        }
    }

 //Form2
 private void button1_Click(object sender, EventArgs e)
    {
        Form1 frm1 = new Form1();
        frm1.FindNext();
    }

有人知道为什么是这样吗?谢谢,坦纳。

4

5 回答 5

1
  string s = Interaction.InputBox("enter search text", "Notepad-search", "", 100, 100);
    //The above syntax is from vb.net so add reference as microsoft.VisualBasic from   references. The above code creates an alertbox. Then type the text which you want search and click on ok.

           int f = richTextBox1.Find(s);
           if (f >= 0)
           {
               MessageBox.Show("search Text is found");
           }
           else
           {
               MessageBox.Show("search Text is not found");
           }
于 2010-09-17T06:32:40.823 回答
0

您在 frm1 的新实例上的文本框肯定没有价值吗?所以该方法没有什么可做的......

尝试单步执行代码并检查您是否确实有可以使用的值?

当你说:

Form1 frm1 = new Form1();

您正在创建一个新版本,因此在访问 frm1 时添加的任何额外信息都没有

试试这个,你会明白我的意思

Form1 frm1 = new Form1();
frm1.Show();

执行此代码时,您将看到您实际上已经创建了表单的另一个实例。

您需要做的是使用原始实例而不是创建一个新实例,以便您的文本框中仍然拥有所有这些信息。

我会让你解决这个问题,但你有答案:)

于 2010-05-14T14:53:52.823 回答
0

通过编写Form1 frm1 = new Form1();,您正在创建一个全新的Form1表单实例,它永远不会获得任何文本,也永远不会向用户显示。

您需要将原始Form1实例传递给Form2inForm2的构造函数。

同样,当您Form2 frm2 = new Form2();输入 时,您正在创建一个没有任何文本FindNext的全新实例。 相反,您应该将文本作为参数传递给该方法。Form2
FindNext

例如:

public void FindNext(string searchText) {
    ...
    findPos = richTextBox1.Find(searchText, findPos, RichTextBoxFinds.None);
    ...
}

originalForm.FindNext(textBox1.Text);
于 2010-05-14T14:56:59.053 回答
0

我认为您可能对如何引用Form1以及Form2相互之间感到困惑。

调用new Form()new Form2()创建对 and 的新实例的引用,它们不会引用已经打开的表单。您需要获取现有实例的引用。Form1Form2

假设这Form1是您的应用程序的主要表单并且它创建和显示Form2,您可以添加一个属性来Form2表示Form1创建它的实例,或者您可以Owner为此目的使用该属性(我建议这样做)。

在最初Form1显示的代码中Form2(不是在上面的代码中),调用frm2.Show(this)而不是frm2.Show(). 这会将Owner您的实例的属性设置为打开它Form2的 Thinstance 。Form1

然后将您的按钮代码更改为Form2

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1 frm1 = (Form1)Owner;
    frm1.FindNext(); 
} 

这将使您参考现有的表格,而不是您想要的新表格。

FindNext函数而言,您有两个选择:您可以保留对的引用Form2(尽管您可能无论如何都想这样做)并直接访问文本,或者您可以更改FindNext为获取一个字符串(这就是我'会推荐)。

public void FindNext(string searchText)
{
    try
    {
        this.Focus();
        richTextBox1.Focus();
        findPos = richTextBox1.Find(searchText, findPos, RichTextBoxFinds.None);
        richTextBox1.Select(findPos + 1, searchText.Length);
        findPos += searchText.Length;
    }
    catch
    {
        MessageBox.Show("No Occurences Found");
        findPos = 0;
    }
}

然后将调用更改为frm1.FindNext()on :Form2frm1.FindNext(textBox1.Text)

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1 frm1 = (Form1)Owner;
    frm1.FindNext(textBox1.Text); 
} 
于 2010-05-14T15:00:48.293 回答
0

看起来您正在引用 Form2 的两个不同实例。

在您的 Form1.FindNext() 中,您有一个新的 Form2 实例,您正在创建并从中获取与您调用 FindNext() 的实例不同的文本值。

您可能想要做的是将表单实例传递给 FindNext()。所以你的功能是......

//Form1
 public void FindNext(Form2 frm2)
{
    try
    {
        this.Focus();
        string s = frm2.textBox1.Text;
        richTextBox1.Focus();
        findPos = richTextBox1.Find(s, findPos, RichTextBoxFinds.None);
        richTextBox1.Select(findPos + 1, s.Length);
        findPos += textBox1.Text.Length;
    }
    catch
    {
        MessageBox.Show("No Occurences Found");
        findPos = 0;
    }
}

//Form2
 private void button1_Click(object sender, EventArgs e)
 {
    Form1 frm1 = new Form1();
    frm1.FindNext(this);
 }
于 2010-05-14T15:02:03.920 回答