2013-11-01 16 views
14

द्वारा अपडेट किए जा रहे मल्टीलाइन टेक्स्टबॉक्स के नीचे स्वत: स्क्रॉल करें मेरे पास एक पृष्ठभूमि कार्यकर्ता नियंत्रण है जो कार्य करने के लिए सेट है, और एक प्रतिनिधि प्रक्रिया का उपयोग करके मेरे मुख्य UI पर एक बहुभाषी टेक्स्ट बॉक्स अपडेट करें। यह सब पूरी तरह से काम कर रहा है, हालांकि टेक्स्ट बॉक्स के निचले भाग को अपडेट करने के बाद, स्क्रॉल बार दिखाई देते हैं, लेकिन निरंतर ताज़ा करने से टेक्स्ट बॉक्स शीर्ष पर लॉक होने का कारण बनता है। आदर्श रूप में, मैं रीयल-टाइम में नवीनतम प्रविष्टि दिखाने के लिए टेक्स्ट बॉक्स को नीचे स्क्रॉल करना चाहता हूं। इसे लागू करने का सबसे अच्छा तरीका क्या होगा?पृष्ठभूमि कार्यकर्ता

मैंने scrolltocaret() विधि का उपयोग करने की कोशिश की है, इसके बिना SelectionStart = txtlog.Text.Length कमांड के साथ और बिना। शायद मैं इसे गलत जगह पर डाल रहा हूं?

कुछ नीचे दिए गए कोड नमूने:

प्रतिनिधि कोड:

Delegate Sub updateresults_delegate(ByVal textbox As TextBox, ByVal text As String) 

Private Sub updatelog_threadsafe(ByVal textbox As TextBox, ByVal text As String) 
      If textbox.InvokeRequired Then 
       Dim mydelegate As New updateresults_delegate(AddressOf updatelog_threadsafe) 
       Me.Invoke(mydelegate, New Object() {textbox, text}) 
       'Me.txtlog.SelectionStart = txtlog.Text.Length 
       'Me.txtlog.ScrollToCaret() 
      Else 
       textbox.Text = text 
      End If 
     End Sub 

मुख्य BackgroundWorker गतिविधि:

For i As Integer = val1 To val2 
'generate an IP address from split host parts and current value of i 
       host = s1(0) & "." & s1(1) & "." & s1(2) & "." & i 
       Try 'attempt to ping the IP 
        Dim reply As PingReply = pingsender.Send(host, timeoutval, buffer, options) 
        If reply.Status = IPStatus.Success Then 
         name = System.Net.Dns.GetHostEntry(host)'get DNS entry 
         resulttext += String.Format("{1} - {2}: reply: Bytes={3} time{4} TTL={5}{0}", vbCrLf, name.HostName, reply.Address.ToString, reply.Buffer.Length, getms(reply.RoundtripTime), reply.Options.Ttl) 'print out success text 
        Else 
         resulttext += String.Format("  {1}: Ping failed. {2}{0}", vbCrLf, host, reply.Status.ToString) 'print out fail text 
        End If 
        updatelog_threadsafe(txtlog, resulttext) 'send text to textbox 

      System.Threading.Thread.Sleep(1000) 
     Catch ex As Exception 

     End Try 
    Next 

मुझे लगता है कि मेरी मुख्य सवाल यह है: मैं बहुत कुछ है कि textbox.scrolltocaret() है कर रहा हूँ जो भी मैं चाहता हूं उसके लिए उपयोग करने के लिए सही तरीका है, लेकिन इसे रखने के लिए मेरे लिए सबसे अच्छी जगह कहां है? मैंने इसे runworkerasync() विधि के बाद प्रतिनिधि, मुख्य पृष्ठभूमि कार्यकर्ता के साथ-साथ & से पहले भी कोशिश की है। इनमें से कोई भी काम नहीं किया, और अब मैं फंस गया हूँ!

उत्तर

22

इसे इस तरह का प्रयास करें:

'textbox.Text = text 
textbox.AppendText(text) 

कोड तुम बाहर टिप्पणी की जीयूआई धागा पर नहीं चल रहा था, और के रूप में एम Granja ने कहा, AppendText स्वचालित रूप से बॉक्स में संलग्न पाठ के लिए स्क्रॉल जाएगा, ताकि ScrollToCaret को कॉल करने की आवश्यकता नहीं है।

+0

प्रतिक्रिया के लिए धन्यवाद करने के लिए पॉप। मैंने इसे प्रतिनिधि में आईएफ कथन में जोड़ा है, और यह अब एक इलाज करता है! प्रारंभ में यह प्रति रोशनी एक दिलचस्प यौगिक संदेश (1 परिणाम, फिर 2 परिणाम, फिर 3 परिणाम, आदि) पैदा कर रहा था। यह + = मैं स्ट्रिंग पर टेक्स्टबॉक्स पर भेजा गया था क्योंकि यह हो गया था। यह अब तय है। धन्यवाद! – almg

+2

बस [इस उत्तर] से एक नोट, (http://stackoverflow.com/a/14886915/613438): यदि आप TextBox.AppendText (स्ट्रिंग टेक्स्ट) का उपयोग करते हैं, तो यह स्वचालित रूप से नए संलग्न टेक्स्ट के अंत तक स्क्रॉल हो जाएगा। यदि आप इसे लूप में बुला रहे हैं तो यह झटकेदार स्क्रॉलबार से बचाता है। यह भी आगे की तुलना में तीव्रता का क्रम होता है। त्वरित संपत्ति। हालांकि यह इस बात पर निर्भर हो सकता है कि आप इसे कितनी बार कॉल कर रहे हैं; –

0

xxx.SetFocus 'xxx = पाठ बॉक्स

SendKeys "^ {END}" के नाम' अंतिम पंक्ति

संबंधित मुद्दे