Sora Blank Ответов: 2

Как мне сделать что-то вроде функции find в notepad++?


Я хочу добавить функцию типа find all in notepad++, в которой она откроет новое окно, отображающее номер строки выделенного слова и само слово. Я получил этот код, но он отображается только в 1 предложении, а не повторяется, как в notepad++.

Что я уже пробовал:

private void button3_Click(object sender, EventArgs e)
       {
           Form2 form2 = new Form2();
           form2.Show();
           form2.textBox11.Text = "";
           string search = textBox1.Text;
           int index = 0;
           System.Collections.ArrayList line = new System.Collections.ArrayList();
           do
           {
               index = richTextBox1.Find(search, index + 1, RichTextBoxFinds.MatchCase);
               if (index != -1)
               {
                   line.Add(richTextBox1.GetLineFromCharIndex(index));
               }
           }
           while ((index != -1));
           {
               System.Collections.IEnumerator myenum = line.GetEnumerator();
               if (line.Count<=0)
               {
                   form2.label11.Text = search+ "was not found";
               }
               else
               {
                   form2.textBox11.SelectedText = search + " was found on line(s): ";
                   while (myenum.MoveNext())
                   {
                       form2.textBox11.SelectedText = myenum.Current+ " ";
                   }
               }
           }

       }

2 Ответов

Рейтинг:
2

OriginalGriff

Для начала прекратите использовать ArrayList - он был заменен универсальными коллекциями в версии 2.0 из.NET. Это нормально для устаревших приложений, но новые проекты должны использовать общие коллекции, такие как List<T> вместо этого.
Во-вторых, прекратите возиться со счетчиками и используйте foreach петля.
В - третьих, не создавайте строки - особенно если они могут стать большими-с помощью добавлений, вместо этого используйте StringBuilder.

StringBuilder message = new StringBuilder();
string search = textBox1.Text;
int index = 0;
List<int> lines = new List<int>();
do
    {
    index = richTextBox1.Find(search, index + 1, RichTextBoxFinds.MatchCase);
    if (index != -1)
        {
        lines.Add(richTextBox1.GetLineFromCharIndex(index));
        }
    }
while ((index != -1));
if (lines.Count <= 0)
    {
    message.Append(search + "was not found");
    }
else
    {
    message.Append(search + " was found on line(s): ");
    string separator = "";
    foreach (int line in lines)
        {
        message.AppendFormat("{0}{1}", separator, line);
        separator = ", ";
        }
    }
Затем отобразите результат:
Form2 form2 = new Form2();
form2.textBox11.Text = message.ToString();
form2.Show();


Рейтинг:
0

Jochen Arndt

Вы должны добавить номера строк к вашим form2.textBox11 На самом деле вы устанавливаете выделение таким образом, чтобы оно в конечном итоге содержало только последний результат:

//form2.textBox11.SelectedText = search + " was found on line(s): ";
form2.textBox11.Text = search + " was found on line(s): ";
while (myenum.MoveNext())
{
    //form2.textBox11.SelectedText = myenum.Current+ " ";
    form2.textBox11.Text += myenum.Current+ " ";
}


Sora Blank

- спасибо, сэр. я попробую твой код.

Sora Blank

это не работает, сэр. он показывает только 1.

Jochen Arndt

Почему он показывает только "1", а не начальный текст " был найден в строке(ах): "?
Это должно сработать, если есть несколько случаев.

Что он показывает при использовании
form2.textBox11.Text = search + " was found " + line.Count + " times on line(s): ";?