2011-12-16 18 views
7

के साथ असंगत परिणाम मैं सी # में RichTextBox के साथ काम कर रहा हूं। यह एक टैबपेज पर मौजूद है। जब टैबपेज का चयन किया जाता है, तो मेरा लक्ष्य RichTextBox को पॉप्युलेट करना है, और अंत तक स्क्रॉल करना है।RichTextBox ScrollToCaret

MyRichTextBox.Select(MyRichTextBox.Text.Length, 0); 
MyRichTextBox.ScrollToCaret(); 

या:

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

यह एक उम्मीद के मुताबिक तरीके से यद्यपि, असंगत परिणाम उत्पादन मैं इस आम सवाल के लिए मुख्य एक की तर्ज पर किया जा रहा है समाधान पर मामूली बदलाव की कोशिश की है,। यह नीचे स्क्रॉलिंग के बीच वैकल्पिक होगा, और नीचे की एक पंक्ति को स्क्रॉल करना होगा। क्रमशः सचित्र (लिंक के लिए खेद है, नए उपयोगकर्ता तो मैं छवियों पोस्ट नहीं कर सकते):
Successfully scrolled to bottom
Scrolled to one line short of the bottom
मुझे अपनी खोजों के माध्यम से इस व्यवहार का उल्लेख कुछ भी नहीं आश्चर्य कर रहा हूँ, और फैसला किया है अगर कोई यहाँ है पूछने के लिए इसका सामना करना पड़ा, और/या दिमाग में एक समाधान है। अगर यह नीचे आता है, तो मुझे लगता है कि मैं itsmatt's answer के साथ कुछ के साथ जा सकता हूं।

+0

एक अनुक्रमण मुद्दा lik लगभग लगता है, लेकिन वास्तव में नहीं कोड आप RTB – MethodMan

+0

कोड के लिए है कि कटका बिना कुछ किया जा सकता है मैंने यहां पोस्ट किया है अनिवार्य रूप से सभी मायने रखता है। मैं कुछ टेक्स्ट के साथ RichTextBox पॉप्युलेट करता हूं, और उसके बाद उस कोड का उपयोग करके नीचे स्क्रॉल करने का प्रयास करता हूं। नियंत्रण के साथ कोई और बातचीत नहीं है। –

+0

ठीक है, मैं आपको यह वास्तविक त्वरित पूछूंगा .. आप किस पंक्ति को स्क्रॉल करना चाहते हैं i.e क्या शब्द .. इंडेक्सऑफ का उपयोग कर लाइन ढूंढें मैं नीचे एक उदाहरण पोस्ट करूंगा। – MethodMan

उत्तर

25

मैं ScrollToCaret साथ कुछ और प्रयोग किया था और यह सिर्फ हर बार एक ही स्थिति में खत्म नहीं होता है। चूंकि मेरा लक्ष्य केवल नीचे तक स्क्रॉल करने तक ही सीमित है, इसलिए यह WB_VSCROLL संदेश (277, या 0x115) को नियंत्रण में भेजने के लिए एक अच्छा उम्मीदवार था, एसबी_PAGEBOTTOM (7) के wParam के साथ।

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 
private const int WM_VSCROLL = 277; 
private const int SB_PAGEBOTTOM = 7; 

public static void ScrollToBottom(RichTextBox MyRichTextBox) 
{ 
    SendMessage(MyRichTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero); 
} 
+0

मदद कर सकता हूं। मुझे एक ही समस्या थी और यह मुझे पागल कर रहा था। यह समाधान लगातार नीचे स्क्रॉल करता है। –

+0

यदि आप पेजबॉटम से "new System.IntPtr (SB_BOTTOM)" के रूप में रूपांतरण डालते हैं, तो VB.NET का स्वचालित अनुवाद भी काम करेगा। –

+0

बहुत बहुत धन्यवाद। मुझे भी वही समस्या थी। – Deulis

1

बदलें यह आपके काम कर कोड फिट करने के लिए ..

String gotoCaret = "Something on this line."; 
int position = textBox.Text.IndexOf(gotoCaret); 
MyRichTextBox.SelectionStart = position; 
MyRichTextBox.ScrollToCaret(); 
+0

हम्म, यह संभव है कि यह किसी के लिए काम करेगा। मुझे यकीन नहीं है कि यह असंगतता पर एक अंतर डालेगा, क्योंकि यह मुद्दा स्क्रॉलटोकैर के साथ प्रतीत होता है। मैं अपने प्रश्न में जो कह रहा था वह यह है कि मैं इसे 'MyRichTextBox.ScrollToCaret();' हर बार एक ही परिस्थिति में, और विभिन्न परिणामों को प्राप्त कर सकता हूं। किसी भी तरह, मेरी RichTextBox सामग्री की प्रकृति किसी विशेष स्ट्रिंग को अविश्वसनीय खोजती है, क्योंकि इसमें टेक्स्ट दोहराया जा सकता है। –

+0

ओह .. यह अच्छा नहीं है कि पाठ दोहराए जाने पर अच्छा है, हालांकि आप प्रत्येक कोड के लिए कुछ बना सकते हैं जो लूप के माध्यम से कुछ गुना होगा और आपके द्वारा खोजे जाने वाले शब्द के कितने बार गिनती होगी .. यदि यह एक बार मौजूद है .. तो MyRichTextBox.ScrollToCaret अन्यथा आप करेंगे उस इंडेक्स स्थिति पर जाना है जहां बार-बार शब्द या चरित्र का अंतिम उदाहरण पाया गया था .. क्या यह समझ में आता है .. – MethodMan

+0

हाँ, असल में अगर मैं उस मार्ग को आजमा देना चाहता था, तो मैं केवल LastIndexOf के लिए जा सकता था और वह पाठ्यक्रम की दोहराने की समस्या को हल करें।:) या मैं पाठ को पूर्ववत करने पर भी विचार कर सकता हूं। तो मुझे बिल्कुल स्क्रॉल करने की ज़रूरत नहीं है! हाहा –

0

मैं एक ही समस्या है, मुझे लगता है एक RTB लगभग काफी विंडोज संदेश द्वारा किया जाता है तो यह एक खरगोश वॉरेन की तरह एक सा लगता है: यह लगातार बहुत नीचे करने के लिए सभी तरह से वास्तव में है कि मैं जरूरत से स्क्रॉल। इसलिए, मैं नहीं जानता कि वैकल्पिक आउटपुट का कारण (लेकिन इसमें थोड़ा सा बग स्वाद है)। मैं इस आरटीबी से स्क्रॉलटोक्रेट झटकेदार आउटपुट से संबंधित हूं लेकिन एक वीबी कार्यक्रम में हूं। आपके कठोर समाधान के लिए प्रशंसा: यह पूरी तरह से काम करता है।

किसी को भी है कि प्रोग्रामिंग वातावरण में इस विसंगति का सामना करते हैं, यहाँ VB कोड

Imports System.Runtime.InteropServices 
Public Class Form 
<DllImport("user32.dll",CharSet:=CharSet.Auto)> _ 
Public Shared Function SendMessage(_ 
ByVal hWnd As IntPtr, _ 
ByVal wMsg As Integer, _ 
ByVal wParam As IntPtr, _ 
ByVal lParam As IntPtr) As Integer 
End Function 
Const WM_SCROLL = 277 
Const SB_PAGEBOTTOM = 7 
Sub ScrollToBottom(ByVal RTBName As RichTextBox) 
    SendMessage(RTBName.Handle, _ 
       WM_SCROLL, _ 
       SB_PAGEBOTTOM, _ 
       IntPtr.Zero) 
End Sub 'then call ScrollToBottom instead of ScrollToCaret 
+0

कोड गुम है ... –

+0

क्षमा करें, लेकिन मैं एक फोन द्वारा लिख ​​रहा हूं, इसलिए पृष्ठ के आर्थिक संस्करण में मैंने कोड बटन नहीं देखा (लेकिन मैंने देखा कि 4 स्पेस बार बराबर हैं) – Bento