【问题标题】:Find, Find Next?寻找,寻找下一个?
【发布时间】:2011-02-19 13:43:50
【问题描述】:

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

 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();
    }

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

【问题讨论】:

  • 为您的表单和控件命名。

标签: c# .net forms find next


【解决方案1】:

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

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

当你说:

Form1 frm1 = new Form1();

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

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

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

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

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

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

【讨论】:

  • 你说得对,我刚刚添加了一个消息框来返回 frm2.textbox1.Text 并且它是空白的。我怎样才能解决这个问题?编辑* 我让它返回一个值,但它仍然无法正常工作
  • @Tanner:您需要将Form2 的原始实例提供给Form1,反之亦然。看我的回答。
【解决方案2】:

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

您需要在Form2 的构造函数中将原始Form1 实例传递给Form2

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

例如:

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

originalForm.FindNext(textBox1.Text);

【讨论】:

    【解决方案3】:

    我认为您可能对如何相互引用Form1Form2 感到困惑。

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

    假设Form1 是您的应用程序的主窗体,它创建并显示Form2,您可以向Form2 添加一个属性,该属性表示创建它的Form1 的实例,或者您可以适当地使用用于此目的的 Owner 属性(我建议这样做)。

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

    然后将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;
        }
    }
    

    然后将Form2上的frm1.FindNext()调用改为frm1.FindNext(textBox1.Text)

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

    【讨论】:

      【解决方案4】:

      看起来您正在引用 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);
       }
      

      【讨论】:

        【解决方案5】:
          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");
                   }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-01
          • 2012-02-29
          • 2021-01-28
          • 1970-01-01
          • 1970-01-01
          • 2014-08-07
          • 2012-08-06
          • 1970-01-01
          相关资源
          最近更新 更多