2009-12-18 19 views
82

मैं एक RichTextBox में जोड़ने के लिए एक स्ट्रिंग के हिस्सों को रंग देने की कोशिश कर रहा हूं। मेरे पास अलग-अलग तारों से बना एक स्ट्रिंग है।एक RichTextBox स्ट्रिंग के विभिन्न हिस्सों रंग

string temp = "[" + DateTime.Now.ToShortTimeString() + "] " + 
       userid + " " + message + Environment.NewLine; 

यह संदेश एक बार बनने के बाद जैसा दिखता है।

[9:23 अपराह्न] उपयोगकर्ता: मेरा संदेश यहां।

मुझे ब्रैकेट [9:23] के भीतर सब कुछ चाहिए और एक रंग होना चाहिए, 'उपयोगकर्ता' एक और रंग होना चाहिए और संदेश एक और रंग होना चाहिए। तब मैं स्ट्रिंग को अपने RichTextBox में जोड़ना चाहता हूं।

मैं इसे कैसे पूरा कर सकता हूं?

+1

डुप्ली? http://stackoverflow.com/questions/455713/selectively-coloring-text-in-richtextbox – abhilash

+0

डुप्, हाँ ... = पी खोज का उपयोग करें! –

+4

मैंने खोज की और मुझे कोई भी उपयोगी नहीं मिला है। – Fatal510

उत्तर

189

यहाँ एक विस्तार विधि है कि एक रंग पैरामीटर के साथ AppendText विधि overloads है:

public static class RichTextBoxExtensions 
{ 
    public static void AppendText(this RichTextBox box, string text, Color color) 
    { 
     box.SelectionStart = box.TextLength; 
     box.SelectionLength = 0; 

     box.SelectionColor = color; 
     box.AppendText(text); 
     box.SelectionColor = box.ForeColor; 
    } 
} 

और यह कैसे आप इसका इस्तेमाल होता है:

var userid = "USER0001"; 
var message = "Access denied"; 
var box = new RichTextBox 
       { 
        Dock = DockStyle.Fill, 
        Font = new Font("Courier New", 10) 
       }; 

box.AppendText("[" + DateTime.Now.ToShortTimeString() + "]", Color.Red); 
box.AppendText(" "); 
box.AppendText(userid, Color.Green); 
box.AppendText(": "); 
box.AppendText(message, Color.Blue); 
box.AppendText(Environment.NewLine); 

new Form {Controls = {box}}.ShowDialog(); 

नोट आप कुछ करता है, तो झिलमिलाते देख सकते हैं कि आप बहुत सारे संदेश आउटपुट कर रहे हैं। RichTextBox फ़्लिकर को कम करने के तरीकों के लिए this C# Corner आलेख देखें।

+2

मुझे इसके साथ कुछ परेशानी थी। मैंने एक और जगह 'बॉक्स में इस्तेमाल किया। टेक्स्ट + = mystring' और इसलिए सभी रंग गायब हो गए। जब मैंने इसे 'box.AppendText (mystring)' के साथ बदल दिया, तो यह एक आकर्षक की तरह काम करता था। – Natrium

+1

मुझे किसी अन्य रंग में स्ट्रिंग जोड़ने पर रंग गायब होने वाले कोड के साथ कुछ परेशानी है। केवल अंतर यह है कि मैं पहले बनाए गए समृद्ध टेक्स्टबॉक्स में var बॉक्स असाइन कर रहा हूं .... –

+0

मैं क्या गलत कर रहा हूं ... "चयन स्टार्ट" RichTextBox की संपत्ति नहीं है (या मैं इसे कम से कम एक्सेस नहीं कर सकता)? मुझे "चयन" मिला लेकिन यह केवल एकमात्र संपत्ति है ... – 00jt

7

मैं एक पैरामीटर के रूप फॉन्ट के साथ विधि का विस्तार किया है:

public static void AppendText(this RichTextBox box, string text, Color color, Font font) 
{ 
    box.SelectionStart = box.TextLength; 
    box.SelectionLength = 0; 

    box.SelectionColor = color; 
    box.SelectionFont = font; 
    box.AppendText(text); 
    box.SelectionColor = box.ForeColor; 
} 
0

पाठ का चयन करना के रूप में किसी से कहा, चयन क्षण भर दिख सकता है। Windows Forms applications में समस्या के लिए कोई अन्य समाधान नहीं है, लेकिन आज मुझे एक खराब, काम करने का तरीका हल करने का तरीका मिला है: आप को RichtextBox पर ओवरलैपिंग में, चयन के दौरान और बदलते रंग या फ़ॉन्ट के दौरान स्क्रीनशॉट के साथ डाल सकते हैं , ऑपरेशन पूरा होने पर, इसे फिर से प्रकट करने के बाद इसे बनाते हैं।

कोड यहाँ है ...

//The PictureBox has to be invisible before this, at creation 
//tb variable is your RichTextBox 
//inputPreview variable is your PictureBox 
using (Graphics g = inputPreview.CreateGraphics()) 
{ 
    Point loc = tb.PointToScreen(new Point(0, 0)); 
    g.CopyFromScreen(loc, loc, tb.Size); 
    Point pt = tb.GetPositionFromCharIndex(tb.TextLength); 
    g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(pt.X, 0, 100, tb.Height)); 
} 
inputPreview.Invalidate(); 
inputPreview.Show(); 
//Your code here (example: tb.Select(...); tb.SelectionColor = ...;) 
inputPreview.Hide(); 

बेहतर WPF उपयोग करने के लिए है, यह समाधान सही नहीं है, लेकिन Winform के लिए यह काम करता है।

3

यह संशोधित संस्करण है जिसे मैंने अपने कोड में रखा है (मैं .NET 4.5 का उपयोग कर रहा हूं) लेकिन मुझे लगता है कि इसे 4.0 पर भी काम करना चाहिए। मूल एक के साथ

public void AppendText(string text, Color color, bool addNewLine = false) 
{ 
     box.SuspendLayout(); 
     box.SelectionColor = color; 
     box.AppendText(addNewLine 
      ? $"{text}{Environment.NewLine}" 
      : text); 
     box.ScrollToCaret(); 
     box.ResumeLayout(); 
} 

अंतर: एक नई लाइन के लिए पाठ जोड़ने के लिए या बस संलग्न

  • चयन को बदलने की कोई जरूरत नहीं

    • संभावना है, यह मजबूर करने के लिए एक ही
    • डाला ScrollToCaret काम करता है autoscroll
    • जोड़ा गया निलंबन/फिर से शुरू लेआउट कॉल
  • 0
    private void Log(string s , Color? c = null) 
         { 
          richTextBox.SelectionStart = richTextBox.TextLength; 
          richTextBox.SelectionLength = 0; 
          richTextBox.SelectionColor = c ?? Color.Black; 
          richTextBox.AppendText((richTextBox.Lines.Count() == 0 ? "" : Environment.NewLine) + DateTime.Now + "\t" + s); 
          richTextBox.SelectionColor = Color.Black; 
    
         } 
    
    0

    मुझे लगता है कि एक RichTextBox में "चयनित पाठ" को संशोधित करना रंगीन पाठ जोड़ने का सही तरीका नहीं है। तो यहाँ एक विधि एक "रंग ब्लॉक" जोड़ने के लिए:

     Run run = new Run("This is my text"); 
         run.Foreground = new SolidColorBrush(Colors.Red); // My Color 
         Paragraph paragraph = new Paragraph(run); 
         MyRichTextBlock.Document.Blocks.Add(paragraph); 
    

    MSDN से:

    ब्लाकों संपत्ति RichTextBox की सामग्री संपत्ति है। यह अनुच्छेद तत्वों का संग्रह है।

    • इनलाइन

    • InlineUIContainer

    • भागो

    • स्पैन

    • बोल्ड

    • : प्रत्येक अनुच्छेद तत्व में सामग्री में निम्नलिखित तत्व शामिल कर सकते हैं
    • हाइपरलिंक

    • इटैलिक

    • रेखांकन

    • LINEBREAK

    तो मुझे लगता है आप भागों रंग के आधार पर अपने स्ट्रिंग विभाजित है, और बनाने के लिए के रूप में कई Run आवश्यक वस्तुओं के रूप में।

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