[c#] كيف أتنقل تلقائيًا إلى أسفل مربع نص متعدد الأسطر؟



4 Answers

يمكنك استخدام مقتطف الشفرة التالي:

myTextBox.SelectionStart = myTextBox.Text.Length;
myTextBox.ScrollToCaret();

الذي سيتم التمرير تلقائيًا إلى النهاية.

Question

لدي مربع نص مع تعيين الخاصية .Multiline إلى true. على فترات منتظمة ، أقوم بإضافة خطوط نصية جديدة إليه. أرغب في أن يتم تمرير مربع النص تلقائيًا إلى أقصى إدخال في الجزء السفلي (الأحدث) عند إضافة سطر جديد. كيف أنجز هذا؟




هذا فقط عملت بالنسبة لي ...

txtSerialLogging-> Text = ""؛

txtSerialLogging-> AppendText (ق)؛

لقد جربت جميع الحالات المذكورة أعلاه ، ولكن المشكلة في حالتي يمكن أن يقل النص ، وزيادة ويمكن أن تظل ثابتة لفترة طويلة. يعني ثابت ، طول ثابت (خطوط) ولكن المحتوى مختلف.

لذا ، كنت أواجه خطًا واحدًا للقفز في النهاية عندما يبقى طول (الخطوط) نفسه لبعض الأوقات ...




textBox1.Focus()
textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();

لم يعمل بالنسبة لي (ويندوز 8.1 ، أيا كان السبب).
وبما أنني لا أزال على .NET 2.0 ، لا يمكنني استخدام ScrollToEnd.

لكن هذا يعمل:

public class Utils
{
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern int SendMessage(System.IntPtr hWnd, int wMsg, System.IntPtr wParam, System.IntPtr lParam);

    private const int WM_VSCROLL = 0x115;
    private const int SB_BOTTOM = 7;

    /// <summary>
    /// Scrolls the vertical scroll bar of a multi-line text box to the bottom.
    /// </summary>
    /// <param name="tb">The text box to scroll</param>
    public static void ScrollToBottom(System.Windows.Forms.TextBox tb)
    {
        if(System.Environment.OSVersion.Platform != System.PlatformID.Unix)
             SendMessage(tb.Handle, WM_VSCROLL, new System.IntPtr(SB_BOTTOM), System.IntPtr.Zero);
    }


}

VB.NET:

Public Class Utils
    <System.Runtime.InteropServices.DllImport("user32.dll", CharSet := System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function SendMessage(hWnd As System.IntPtr, wMsg As Integer, wParam As System.IntPtr, lParam As System.IntPtr) As Integer
    End Function

    Private Const WM_VSCROLL As Integer = &H115
    Private Const SB_BOTTOM As Integer = 7

    ''' <summary>
    ''' Scrolls the vertical scroll bar of a multi-line text box to the bottom.
    ''' </summary>
    ''' <param name="tb">The text box to scroll</param>
    Public Shared Sub ScrollToBottom(tb As System.Windows.Forms.TextBox)
        If System.Environment.OSVersion.Platform <> System.PlatformID.Unix Then
            SendMessage(tb.Handle, WM_VSCROLL, New System.IntPtr(SB_BOTTOM), System.IntPtr.Zero)
        End If
    End Sub


End Class



سيتم التمرير إلى نهاية مربع النص عند تغيير النص ، ولكنه يسمح للمستخدم بالتمرير لأعلى

outbox.SelectionStart = outbox.Text.Length;
outbox.ScrollToEnd();

اختبارها على Visual Studio Enterprise 2017




حاول إضافة التعليمة البرمجية المقترحة إلى الحدث TextChanged:

private void textBox1_TextChanged(object sender, EventArgs e)
{
  textBox1.SelectionStart = textBox1.Text.Length;
  textBox1.ScrollToCaret();
}



Related