it-swarm.com.de

So scrollen Sie in einem Textfeld nach Code in C #

Ich verwende Winforms und aktualisiere ab und zu ein Textfeld (mit Meldungen). Wenn der Text das Ende des Felds erreicht, werden jedoch Bildlaufleisten angezeigt, und ich weiß nicht, wie ich nach unten scrollen soll der Boden Das einzige, was ich sehe, ist ScrollToCaret, aber Caret steht am Anfang des Textes. Was ist der Befehl zum Scrollen?

24
Nefzen

Sie können dies tun, indem Sie eine Funktion namens ScrollToCaret verwenden. Sie müssen zuerst die Einfügemarke an das Ende des Textfelds setzen, dann können Sie zu diesem blättern. So geht's: 

        //move the caret to the end of the text
        textBox.SelectionStart = textBox.TextLength;
        //scroll to the caret
        textBox.ScrollToCaret();
34
Doctor Jones

Dies ist ein bisschen eine alte Frage, aber keine der vorgeschlagenen Antworten funktionierte für mich (ScrollToCaret () funktioniert nur, wenn die TextBox den Fokus hat). Für den Fall, dass irgendwann danach etwas mehr gesucht werden sollte, dachte ich, ich würde das teilen, was ich als Lösung gefunden habe:

public class Utils
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, 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(TextBox tb)
    {
        SendMessage(tb.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero);
    }
}

Die Lösung für die Lösung sollte in diesem Beitrag unter bytes.com abgelegt werden: http://bytes.com/topic/c-sharp/answers/248500-scroll-bottom-textbox#post1005377

27
Julian

Wenn Sie die AppendText () - Methode des Textfelds verwenden, wird der Text an den unteren Rand eines vorhandenen Texts angehängt und das Steuerelement wird angezeigt, um es anzuzeigen.

14
Metro

Sie müssen Ihr Caret am Ende Ihres Textes setzen:

textBox1.Text += "your new text";
textBox1.Select(textBox1.Text.Length - 1, 0);
textBox1.ScrollToCaret();
4
Francis B.

C # Verwenden Sie die Windows-API (user32.dll), um nach oben/unten zu scrollen

Zuerst müssen wir einen konstanten Wert definieren:

const int EM_LINESCROLL = 0x00B6;
const int SB_HORZ = 0;
const int SB_VERT = 1;

Dann müssen wir zwei externe Methoden von user32.dll deklarieren:

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);

Verwenden Sie schließlich diese Methoden, um die eigentliche Aufgabe zu erfüllen:

SetScrollPos(myTextBox.Handle,SB_VERT,myTextBox.Lines.Length-1,true);
SendMessage(myTextBox.Handle,EM_LINESCROLL,0,myTextBox.Lines.Length-1);

Erledigt! Simpel und einfach! Getestet! ursprünglicher Beitrag

2
Toxig

Sie können die SetScrollPos-API verwenden:

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

[DllImport("user32.dll")]
static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos);

const int SB_HORZ = 0;
const int SB_VERT = 1;
const int SB_CTL = 2;


...

void ScrollToBottom(Control ctl)
{
    int min;
    int max;
    if (GetScrollRange(ctl.Handle, SB_VERT, out min, out max))
    {
        SetScrollPos(ctl.Handle, SB_VERT, max, true);
    }
}

(ungetestet)

0
Thomas Levesque

Nachdem ich gesucht hatte und nie eine legitime Lösung gefunden hatte, die mit und ohne Fokus sowie horizontal und vertikal funktioniert, stolperte ich über eine API-Lösung, die (zumindest für meine Plattform - Win7/.Net4 WinForms) funktioniert.

using System;
using System.Runtime.InteropServices;

namespace WindowsNative
{
    /// <summary>
    /// Provides scroll commands for things like Multiline Textboxes, UserControls, etc.
    /// </summary>
    public static class ScrollAPIs
    {
        [DllImport("user32.dll")]
        internal static extern int GetScrollPos(IntPtr hWnd, int nBar);

        [DllImport("user32.dll")]
        internal static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

        [DllImport("user32.dll")]
        internal static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

        public enum ScrollbarDirection
        {
            Horizontal = 0,
            Vertical = 1,
        }

        private enum Messages
        {
            WM_HSCROLL = 0x0114,
            WM_VSCROLL = 0x0115
        }

        public static int GetScrollPosition(IntPtr hWnd, ScrollbarDirection direction)
        {
            return GetScrollPos(hWnd, (int)direction);
        }

        public static void GetScrollPosition(IntPtr hWnd, out int horizontalPosition, out int verticalPosition)
        {
            horizontalPosition = GetScrollPos(hWnd, (int)ScrollbarDirection.Horizontal);
            verticalPosition = GetScrollPos(hWnd, (int)ScrollbarDirection.Vertical);
        }

        public static void SetScrollPosition(IntPtr hwnd, int hozizontalPosition, int verticalPosition)
        {
            SetScrollPosition(hwnd, ScrollbarDirection.Horizontal, hozizontalPosition);
            SetScrollPosition(hwnd, ScrollbarDirection.Vertical, verticalPosition);
        }

        public static void SetScrollPosition(IntPtr hwnd, ScrollbarDirection direction, int position)
        {
            //move the scroll bar
            SetScrollPos(hwnd, (int)direction, position, true);

            //convert the position to the windows message equivalent
            IntPtr msgPosition = new IntPtr((position << 16) + 4);
            Messages msg = (direction == ScrollbarDirection.Horizontal) ? Messages.WM_HSCROLL : Messages.WM_VSCROLL;
            SendMessage(hwnd, (int)msg, msgPosition, IntPtr.Zero);
        }
    }
}

Verwenden Sie bei einem mehrzeiligen Textfeld (tbx_main) Folgendes:

        int horzPos, vertPos;
        ScrollAPIs.GetScrollPosition(tbx_main.Handle, out horzPos, out vertPos);

        //make your changes
        //something like the following where m_buffer is a string[]
        tbx_main.Text = string.Join(Environment.NewLine, m_buffer);

        tbx_main.SelectionStart = 0;
        tbx_main.SelectionLength = 0;

        ScrollAPIs.SetScrollPosition(tbx_main.Handle, horzPos, vertPos);
0
Joe