2011-02-07 24 views
5

मैं एप्लिकेशन लॉग प्रदर्शित करने के लिए RichTextBox नियंत्रण का उपयोग कर रहा हूं। मैं RichTextBox :: AppendText विधि की कुछ कॉल के साथ एक बार एक बार नियंत्रण अद्यतन कर रहा हूं। मेरे लिए वास्तव में परेशान करना यह है कि कर्सर टेक्स्ट की आखिरी पंक्ति पर स्क्रॉल करता रहता है। स्थिति में यह बहुत ही असहज है जब उपयोगकर्ता को शुरुआत में लॉग का विश्लेषण करने की आवश्यकता होती है। मैं मेरी समस्या के लिए निम्न समाधान की कोशिश की है: क्योंकि नियंत्रण समय-समय पर redrawed की जा रही है जो बहुत ध्यान भंग हैRichTextBox ऑटोस्कोल को अक्षम करना

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

यह समस्या के मूल करने के लिए जाना नहीं है। क्या कुछ क्लीनर समाधान है?

+0

यह थोड़ा अजीब अंत करने के लिए जा स्पष्ट रूप से कहीं न कहीं से किया जाना चाहिए, क्योंकि लगता है काम कर सकते हैं। क्या आप सुनिश्चित हैं कि संलग्न कोड अंत में चयन को सेट नहीं करेगा? –

+0

नहीं, बस एपेंडटेक्स्ट ("टेक्स्ट"), एपेंडटेक्स्ट ("\ t"), एपेंडटेक्स्ट ("\ n") – truthseeker

+0

मुझे दिलचस्प चीज़ मिली। Autoscroll तभी होता है जब टेक्स्ट क्षेत्र पर ध्यान केंद्रित किया जाता है। टेक्स्ट एरिया में क्लिक करने के बाद चीजें गलत हो जाती हैं। अगर मैं इसमें क्लिक नहीं करता हूं, तो मैं नए संदेश जोड़े जाने के साथ-साथ स्क्रॉलबार के साथ संदेशों को स्क्रॉल कर सकता हूं और टेक्स्ट कूद नहीं रहा है। – truthseeker

उत्तर

7

आपकी समस्या "स्क्रॉल" नीचे जब तुम लॉग पाठ जोड़ रहे हैं स्क्रॉल के साथ है, लेकिन आप इसे शीर्ष पर हर समय होना चाहता हूँ चाहते हैं:

आप VScroll को ईवेंट हैंडलर्स जोड़ने के लिए, TextChanged घटनाओं और ईवेंट हैंडलर में शीर्ष पर

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); 
} 

तुम भी क्षैतिज स्क्रॉल पट्टी के साथ भी ऐसा हो सकता है स्क्रॉल निर्धारित किया है। SB_LEFT साथ WM_HSCROLL और SB_TOP साथ WM_VSCROLL बदलें

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

आप tb_logs.SelectionLength = 1 कोशिश कर सकते हैं; चयन स्टार्ट के साथ। यह आपकी वर्तमान स्थिति से 1 char चयनित होगा।

यह कोशिश नहीं ... लेकिन