2010-05-14 6 views
0

Je suis en train de faire une trouvaille, trouver la fonction suivante pour mon programme, que j'ai réussi à faire avec ce code:Trouver, Trouver Suivant?

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

Et il fonctionne très bien dans form1 mais si j'utilise ce code et essayez d'appeler il de form2 Il ne fait rien:

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

Est-ce que quelqu'un sait pourquoi c'est? Merci, Tanner.

+1

** S'il vous plaît ** Le nom de votre formulaires et des contrôles. – SLaks

Répondre

0

Je pense que vous pouvez être confus dans la façon dont vous faites référence les uns des autres et Form1Form2.

Appel new Form() et new Form2() créer des références à nouvelles cas de Form1 et Form2, ils ne mentionnent pas les formes qui sont déjà ouvertes. Vous devez obtenir les références des instances existantes.

En supposant que Form1 est la principale forme pour votre application et il crée et montre Form2, vous pouvez ajouter une propriété à Form2 qui représente l'instance de Form1 qui l'a créé, ou vous pouvez approprier la propriété Owner à cet effet (Je recommanderais ça).

Dans votre code sur Form1 qui montre Form2 d'abord (pas dans le code que vous avez ci-dessus), appelez frm2.Show(this) au lieu de simplement frm2.Show(). Cela définira la propriété Owner de votre instance Form2 égale à l'instance de Form1 qui l'a ouvert.

Ensuite, changez votre code de bouton pour Form2 à ceci:

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

Cela vous fera référence à la forme existante plutôt qu'une nouvelle, qui est ce que vous voulez.

En ce qui concerne la fonction FindNext va, vous avez deux choix: soit vous pouvez tenir à la référence de Form2 (si vous voulez probablement faire de toute façon) et accéder au texte directement, ou vous pouvez changer FindNext prendre une chaîne (c'est ce que je recommanderais).

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

changer l'appel à frm1.FindNext() sur Form2 à frm1.FindNext(textBox1.Text):

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

Votre zone de texte sur la nouvelle instance de frm1 n'aura sûrement aucune valeur? Donc, il n'y a rien à faire pour la méthode ...

Essayez de parcourir le code et vérifiez que vous avez réellement des valeurs avec lesquelles travailler.

Quand vous dites:

Form1 frm1 = new Form1(); 

Vous créez une nouvelle version et toute information supplémentaire, vous des thats été ajouté n'avez pas lors de l'accès frm1

Essayez et vous verrez ce que je veux dire

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

Lorsque ce code est exécuté, vous verrez que vous avez réellement créé une autre instance de votre formulaire. Ce que vous devez faire est de travailler avec l'instance d'origine plutôt que d'en créer une nouvelle, de sorte que vous ayez toujours toutes ces informations dans vos zones de texte.

Je vous laisse travailler celui-ci, mais il vous est la réponse :)

+0

Votre correcte, je viens d'ajouter un messagebox pour retourner frm2.textbox1.Text et il était vide. Comment puis-je réparer cela? EDIT * Je l'ai obtenu pour retourner une valeur mais cela ne fonctionne toujours pas – Tanner

+0

@Tanner: Vous devez donner à 'Form2' l'instance originale de' Form1', et vice-versa. Vois ma réponse. – SLaks

0

En écrivant Form1 frm1 = new Form1();, vous créez une instance flambant neuf de la forme Form1, qui ne reçoit aucun texte et n'est jamais montré à l'utilisateur.

Vous devez transmettre l'instance Form1 d'origine à Form2 dans le constructeur de .

De même, lorsque vous écrivez Form2 frm2 = new Form2(); dans FindNext, vous créez une toute nouvelle instance Form2 sans texte. À la place, vous devez passer le texte en tant que paramètre à la méthode FindNext.

Par exemple:

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

originalForm.FindNext(textBox1.Text); 
0

On dirait que vous faites référence à deux cas différents de Form2.

Dans votre Form1.FindNext() vous avez une nouvelle instance de Form2 que vous créez et obtenez la valeur de texte à partir de laquelle est différente de l'instance d'où vous appelez votre FindNext().

Ce que vous pourriez vouloir faire est de passer dans l'instance du formulaire à FindNext(). Donc, votre fonction serait ...

//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"); 
      } 
Questions connexes