2010-05-14 86 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"); 
      }