C# 每x秒自动向下滚动C1行中的文本框

C# 每x秒自动向下滚动C1行中的文本框,c#,winforms,textbox,scroll,autoscroll,C#,Winforms,Textbox,Scroll,Autoscroll,我试图让一个文本框每X秒自动向下滚动一行。 我已经找到了AutoScrolOffset和ScrollToCaret函数,但是这些函数并没有给出期望的结果 我认为我的解决方案是在backgroundworkerthread中执行autoscroll函数,即每x秒向下滚动1行。但是我不知道怎么做,而且网上的信息也没有多大用处 我希望有人能帮助我,提前 我正在使用.net 4.5,从中大量借用,并将其与计时器相结合,您可以执行以下操作: private int lineNumber = 1; pri

我试图让一个文本框每X秒自动向下滚动一行。 我已经找到了AutoScrolOffset和ScrollToCaret函数,但是这些函数并没有给出期望的结果

我认为我的解决方案是在backgroundworkerthread中执行autoscroll函数,即每x秒向下滚动1行。但是我不知道怎么做,而且网上的信息也没有多大用处

我希望有人能帮助我,提前

我正在使用.net 4.5,从中大量借用,并将其与计时器相结合,您可以执行以下操作:

private int lineNumber = 1;

private void timer1_Tick(object sender, EventArgs e)
{
    nfobox.HideSelection = false;
    nfobox.SelectionStart = nfobox.GetFirstCharIndexFromLine(lineNumber - 1);
    nfobox.SelectionLength = nfobox.Lines[lineNumber - 1].Length;
    nfobox.ScrollToCaret();

    lineNumber++;

    // include some code to detect the last line, or you'll get an exception
}
只有当您的行由换行符分隔时,这才有效


如果是一条长长的线,那么在第一次勾选时整个事情都会被选中,然后就完成了。

格兰特·温尼是正确的。您不能直接从后台线程修改Uİ。 但是你用下面的方法

int lineCounter = 0;
    int nextLineLength = 0;
    private void timer1_Tick(object sender, EventArgs e)
    {
        textBox1.SelectionStart = nextLineLength;
        textBox1.SelectionLength = 0;
        textBox1.ScrollToCaret();
        nextLineLength += textBox1.Lines[lineCounter++].Length + "\r\n".Length; //"\r\n" is next line parameters

    }

@GrantWinney不是100%正确的。您可以从后台线程修改GUI,但该线程需要GUI上的句柄,例如mainform,然后您需要使用invoke there have,是吗,我讨厌这会引起的问题,因为你需要看看手柄是否存在,并在手柄周围放置一个try/catch块,仍然祈祷没有赛车状态。这与卷轴本身有些关联:@grantwiney这里是主要功能,我没有使用任何东西,但卷轴已经完成,非常感谢你们的回复!抱歉,我刚刚看到GetFirstCharIndexFromLine并删除了评论@我非常感谢你!这让它起作用了@GrantWinney不,这个public void setTxt方法工作得很好,我不想给这个方法一个textbox,因为我使用的textbox已经为整个类定义好了,我可以这样设置Text属性: