2010-05-14 83 views
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(); 
    } 

有没有人知道这是为什么? Tanner,谢谢你。

+1

** **请命名您的窗体和控件。 – SLaks 2010-05-14 14:57:22

回答

0

我认为你可以在你如何相互引用Form1Form2混淆。

调用new Form()new Form2()创建引用Form1Form2情况下,他们不引用已打开的形式。您需要获取现有实例的参考。

假设Form1是应用程序的主要形式,它创造并显示Form2,您可将属性添加到Form2代表的Form1创建它的实例,或者你可以适当的Owner属性用于此目的(我建议)。

Form1的代码中,最初显示的是Form2(不在上面的代码中),请致电frm2.Show(this)而不是frm2.Show()。这会将您的Form2实例的Owner属性设置为等于打开它的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; 
    } 
} 

然后改变Form2frm1.FindNext(textBox1.Text)调用frm1.FindNext()

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

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

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

当你说:

Form1 frm1 = new Form1(); 

您正在创建一个新的版本,所以任何额外的信息,多数民众赞成加入你没有访问的frm1

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

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

当这段代码被执行时,你会看到你实际上已经创建了另一个表单实例。

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

我将离开你的工作这一个,但有你的答案:)

+0

您的正确,我只是添加一个消息框来返回frm2.textbox1.Text,它是空白的。我怎样才能解决这个问题? 编辑*我得到它返回一个值,但它仍然无法正常工作 – Tanner 2010-05-14 14:57:41

+0

@Tanner:你需要给Form2的原始实例Form2,反之亦然。看到我的答案。 – SLaks 2010-05-14 14:59:20

0

通过写Form1 frm1 = new Form1();,正在创建的Form1形式,它从来没有得到任何文本的一个全新的实例,永远不会显示给用户。

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

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

例如:

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

originalForm.FindNext(textBox1.Text); 
0

看起来你引用窗体2的两个不同的实例。

在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); 
} 
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"); 
      }