2011-02-07 57 views
5

Tôi đang sử dụng kiểm soát RichTextBox để hiển thị nhật ký ứng dụng. Tôi đang cập nhật kiểm soát mỗi giây một lần với một vài cuộc gọi của phương thức RichTextBox :: AppendText. Điều thực sự gây phiền nhiễu cho tôi là con trỏ tiếp tục cuộn đến dòng cuối cùng của văn bản. Rất khó chịu trong tình huống khi người dùng cần phân tích nhật ký ban đầu. Tôi đã thử giải pháp sau đây cho vấn đề của mình:Tắt tính năng tự động ghi RichTextBox

int pos = tb_logs.SelectionStart; 
tb_logs.AppendText("log message"); 
tb_logs.SelectionStart = pos; 

Điều này không đi đến cốt lõi của sự cố vì kiểm soát được vẽ lại định kỳ rất mất tập trung. Có một số giải pháp sạch hơn?

+0

Nghe có vẻ hơi lạ vì đi đến cuối nên được thực hiện rõ ràng ở đâu đó. Bạn có chắc chắn mã phụ thêm không định đặt lựa chọn thành chính nó không? –

+0

Không, chỉ cần AppendText ("văn bản"), AppendText ("\ t"), Appendtext ("\ n") – truthseeker

+0

Tôi đã tìm thấy điều thú vị. Tự động ghi chỉ xảy ra khi vùng văn bản có tiêu điểm. Sau khi nhấp vào khu vực văn bản mọi thứ đi sai. Nếu tôi không bấm vào nó, tôi có thể cuộn tin nhắn với thanh cuộn đồng thời với các tin nhắn mới được thêm vào và văn bản không nhảy. – truthseeker

Trả lời

7

Nếu vấn đề của bạn là với "Vertical Scroll" di chuyển xuống khi bạn đang thêm các văn bản Log, nhưng bạn sẽ muốn nó được trên tất cả các thời gian:

bạn phải thêm xử lý sự kiện để VScroll, Sự kiện TextChanged và trong trình xử lý sự kiện đặt cuộn lên trên cùng

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll; 
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll; 

private const UInt32 SB_TOP = 0x6; 
private const UInt32 WM_VSCROLL = 0x115; 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, 
    IntPtr wParam, IntPtr lParam); 

private void HandleRichTextBoxAdjustScroll(Object sender, 
    EventArgs e) 
{ 
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero); 
} 

Bạn cũng có thể làm tương tự với thanh cuộn ngang. Thay thế WM_VSCROLL bằng WM_HSCROLL và SB_TOP bằng SB_LEFT

private const UInt32 WM_HSCROLL = 0x0114; 
private const UInt32 SB_LEFT = 0x06; 
0

Bạn có thể thử tb_logs.SelectionLength = 1; cùng với SelectionStart. Điều này sẽ làm cho 1 char được chọn từ Vị trí hiện tại của bạn.

Không cố gắng ... Nhưng có thể hoạt động

Các vấn đề liên quan