2013-09-04 6 views
0

Я пытаюсь реализовать пользовательский текстовый редактор на C# с использованием компонента ScintillaNET. У меня есть большая часть этого до сих пор, но застряла в какой-то момент. Я хочу дать пользователю возможность блокировать комментарий/раскомментировать выделенный текст. Я много пробовал, но не могу найти примеры в Интернете. Единственное, что мне кажется, чтобы получить от объекта Selection элемента управления являются начальным и конечным точкам, но это не очень поможетВнедрить комментарий блока/раскоммента в элементе управления ScintillaNET

private void commentBlockToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (txtSQL.Selection.Text.Length > 0) 
     { 
      String start = txtSQL.Selection.Start.ToString(); 
      String end = txtSQL.Selection.End.ToString(); 
      MessageBox.Show(start + "::" + end); 

     } 
    } 

Были ли вам удалось успешно осуществить это с помощью элемента управления ScintillaNET?

EDIT: После некоторой импровизации я могу как-то это сделать, но после комментария блока последняя строка выходит из выбора!

private void commentBlockToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (txtSQL.Selection.Text.Length > 0) 
     { 
      Range range = txtSQL.Selection.Range; 
      int f = range.StartingLine.Number; 
      int t = range.EndingLine.Number; 
      int endpos = txtSQL.Selection.End; 
      for (int i = f; i <= t; i++) 
      { 
       //txtSQL.GoTo.Line(i); 
       string tstr = txtSQL.Lines[i].Text.Replace(Environment.NewLine, ""); 
       txtSQL.Lines[i].Text = "--" + tstr; 
      } 
     } 
    } 

ответ

2

После нескольких экспериментов я нашел способ выполнить это. Хотя я сомневаюсь, что это самые элегантные решения!

private void commentBlockToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (txtSQL.Selection.Text.Length > 0) 
     { 
      Range range = txtSQL.Selection.Range; 
      int f = range.StartingLine.Number; 
      int t = range.EndingLine.Number; 
      for (int i = f; i <= t; i++) 
      { 
       txtSQL.InsertText(txtSQL.Lines[i].StartPosition,"--"); 
      } 
      txtSQL.Selection.Start = txtSQL.Lines[f].StartPosition; 
      txtSQL.Selection.End = txtSQL.Lines[t].EndPosition; 
     } 
    } 
0

На самом деле я нашел очень простое решение. Чтобы блокировать комментарий делать

scintilla1.Lexing.LineComment(); 

И блокировать раскомментируйте сделать

scintilla1.Lexing.LineUncomment(); 
+0

Это больше не поддерживается: https://github.com/jacobslusser/ScintillaNET/issues/286 – Nikolai