Найти, найти дальше? - PullRequest
0 голосов
/ 14 мая 2010

Я пытаюсь найти, найти следующую функцию для моей программы, которую мне удалось сделать с помощью этого кода:

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

Кто-нибудь знает, почему это так? Спасибо, Таннер.

Ответы [ 5 ]

1 голос
/ 17 сентября 2010
  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");
           }
0 голосов
/ 14 мая 2010

Похоже, вы ссылаетесь на два разных экземпляра 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);
 }
0 голосов
/ 14 мая 2010

Написав Form1 frm1 = new Form1();, вы создаете совершенно новый экземпляр формы Form1, который никогда не получает текст и никогда не показывается пользователю.

Вам необходимо передать исходный экземпляр Form1 в Form2 в конструкторе Form2.

Аналогичным образом, когда вы пишете Form2 frm2 = new Form2(); в FindNext, вы создаете совершенно новый экземпляр Form2 без текста.
Вместо этого вы должны передать текст в качестве параметра методу FindNext.

Например:

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

originalForm.FindNext(textBox1.Text);
0 голосов
/ 14 мая 2010

Я думаю, вы можете быть смущены тем, как вы ссылаетесь Form1 и Form2 друг на друга.

Вызов new Form() и new Form2() создает ссылки на новые экземпляры Form1 и Form2, они не ссылаются на уже открытые формы. Вам необходимо получить ссылки для существующих экземпляров.

Предполагая, что Form1 является основной формой для вашего приложения, и она создает и показывает Form2, вы можете либо добавить свойство к Form2, которое представляет экземпляр Form1, который его создал, либо вы можете присвоить Owner свойство для этой цели (я бы рекомендовал это).

В вашем коде на Form1, который изначально показывает Form2 (не в том коде, который у вас есть выше), наберите frm2.Show(this) вместо frm2.Show(). Это установит свойство Owner вашего экземпляра Form2 равным тонкости 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() на Form2 на frm1.FindNext(textBox1.Text):

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1 frm1 = (Form1)Owner;
    frm1.FindNext(textBox1.Text); 
} 
0 голосов
/ 14 мая 2010

Ваше текстовое поле в новом экземпляре frm1 не будет иметь никакого значения наверняка? Так что метод ничего не делает ...

Попробуйте пройти по коду и проверить, действительно ли у вас есть значения для работы?

Когда вы говорите:

Form1 frm1 = new Form1();

Вы создаете свежую версию, поэтому любая дополнительная информация, которую вы добавили, отсутствует при доступе к frm1

Попробуйте, и вы поймете, что я имею в виду

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

Когда этот код будет выполнен, вы увидите, что вы действительно сделали еще один экземпляр вашей формы.

Что вам нужно сделать, это работать с исходным экземпляром, а не создавать новый, чтобы у вас все еще была вся эта информация в текстовых полях.

Я оставлю вас работать над этим, но вы ответите:)

...