C# 转到文本编辑器中的行

C# 转到文本编辑器中的行,c#,.net,winforms,C#,.net,Winforms,我尝试在一个基本编辑器类型的应用程序中实现GoTo-ling,但并不总是准确的。通常情况下,它会得到正确的线路,但似乎线路越多,它就越有可能得到错误的线路位置并走到错误的线路。不知道为什么这不起作用。有人能帮忙吗 int position = 0; int lineCount = ((TextBox)tabControl1.SelectedTab.Controls[0]).Lines.Count(); for (int i = 0; i < LineNumber; i++) {

我尝试在一个基本编辑器类型的应用程序中实现GoTo-ling,但并不总是准确的。通常情况下,它会得到正确的线路,但似乎线路越多,它就越有可能得到错误的线路位置并走到错误的线路。不知道为什么这不起作用。有人能帮忙吗

int position = 0;
int lineCount = ((TextBox)tabControl1.SelectedTab.Controls[0]).Lines.Count();

for (int i = 0; i < LineNumber; i++)
{
     position += ((TextBox)tabControl1.SelectedTab.Controls[0]).Lines[i].Count();
}

((TextBox)tabControl1.SelectedTab.Controls[0]).Focus();
((TextBox)tabControl1.SelectedTab.Controls[0]).SelectionStart = position;
((TextBox)tabControl1.SelectedTab.Controls[0]).ScrollToCaret();
LineNumber = 0;
position = 0;
lineCount = 0;

我不确定是否正确理解了您的意思,但TextBox控件有一个名为

TextBoxBase

因此,如果您的用户想要转到第10行,而您有10行,那么

 int pos = textBox1.GetFirstCharIndexFromLine(9);
 textBox1.SelectionStart = pos;
 textBox1.ScrollToCaret();

我不确定是否正确理解了您的意思,但TextBox控件有一个名为

TextBoxBase

因此,如果您的用户想要转到第10行,而您有10行,那么

 int pos = textBox1.GetFirstCharIndexFromLine(9);
 textBox1.SelectionStart = pos;
 textBox1.ScrollToCaret();

我想@Steve已经用TextBox.GetFirstCharIndexFromLine覆盖了你

但是,在您的原始代码中,我认为您只需要考虑每行末尾的回车/换行符,当通过Lines属性访问每行时,它们不包括在内。本例假设所需的行是1基于1的:

        int LineNumber = 6;

        TextBox TB = (TextBox)tabControl1.SelectedTab.Controls[0];

        int position = 0;
        for (int i = 1; i <= TB.Lines.Length && i < LineNumber; i++)
        {
            position += TB.Lines[i - 1].Length + Environment.NewLine.Length;
        }

        TB.Focus();
        TB.SelectionStart = position;
        TB.SelectionLength = 0;
        TB.ScrollToCaret();

我想@Steve已经用TextBox.GetFirstCharIndexFromLine覆盖了你

但是,在您的原始代码中,我认为您只需要考虑每行末尾的回车/换行符,当通过Lines属性访问每行时,它们不包括在内。本例假设所需的行是1基于1的:

        int LineNumber = 6;

        TextBox TB = (TextBox)tabControl1.SelectedTab.Controls[0];

        int position = 0;
        for (int i = 1; i <= TB.Lines.Length && i < LineNumber; i++)
        {
            position += TB.Lines[i - 1].Length + Environment.NewLine.Length;
        }

        TB.Focus();
        TB.SelectionStart = position;
        TB.SelectionLength = 0;
        TB.ScrollToCaret();

真奇怪,我以前从没见过。但是谢谢!这很有魅力:-这很奇怪,我以前从未见过。但是谢谢!这很有魅力:-