在ScintillaNET控件中实现块注释/取消注释

时间:2013-09-04 12:36:59

标签: c# scintilla

我尝试使用ScintillaNET组件在C#中实现自定义文本编辑器。到目前为止,我已经完成了大部分工作,但一度陷入困境。我想让用户能够阻止评论/取消注释所选文本。我尝试了很多,但在网上找不到任何例子。我似乎从控件的Selection对象中得到的唯一东西是Start和End位置,但这并没有多大帮助

    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控件成功实现此功能?

编辑: 经过一些改进之后,我能够以某种方式做到这一点,但在阻止评论后,最后一行移出选择!

    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 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分:0)

实际上我找到了一个非常简单的解决方案。要阻止评论

scintilla1.Lexing.LineComment();

并阻止取消注释

scintilla1.Lexing.LineUncomment();
相关问题