2011-08-15 13 views
12

मैं WinForms RichTextBox का उपयोग कर रहा हूं। ऐसा प्रतीत होता है कि जब RichTextBox एक रूप पर है, \r\n\n में परिवर्तित हो जाता है। यहां एक परीक्षण है:RichTextBox न्यूलाइन रूपांतरण?

मेरे पास दो समृद्ध टेक्स्ट बॉक्स हैं। एक richTextBox1, जो प्रपत्र पर रखा गया है है:

this.richTextBox1 = new System.Windows.Forms.RichTextBox(); 
    this.SuspendLayout(); 
    // 
    // richTextBox1 
    // 
    this.richTextBox1.Location = new System.Drawing.Point(37, 12); 
    this.richTextBox1.Name = "richTextBox1"; 
    this.richTextBox1.Size = new System.Drawing.Size(100, 96); 
    this.richTextBox1.TabIndex = 0; 
    this.richTextBox1.Text = ""; 
अन्य

rtb, जो मैं मौके पर ही पैदा करते हैं।

var rtb = new RichTextBox(); 
    string enl = "Cheese" + Environment.NewLine + "Whiz"; 
    rtb.Text = enl; 
    string ncr = rtb.Text; 
    MessageBox.Show(string.Format("{0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
           enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           ncr.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           Environment.NewLine, 
           (enl == ncr), Environment.NewLine, 
           enl.Contains(Environment.NewLine), Environment.NewLine, 
           ncr.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\r\nWhiz 
    --- 
    True 
    True 
    True 
    */ 
    richTextBox1.Text = enl; 
    string ncr2 = richTextBox1.Text; 
    MessageBox.Show(string.Format("{0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
           enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           ncr2.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           Environment.NewLine, 
           (enl == ncr2), Environment.NewLine, 
           enl.Contains(Environment.NewLine), Environment.NewLine, 
           ncr2.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\nWhiz 
    --- 
    False 
    True 
    False 
    */ 

RichTextBox कुछ अजीब व्यवहार का प्रदर्शन किया जा रहा है: जब मैं इस कोड (फार्म लोड घटना में) चलाते हैं। जब मैंने अभी बनाया है बॉक्स में \r\n युक्त टेक्स्ट डाला है, तो यह वही रहता है (अभी भी \r\n है)। हालांकि, जब मैं फॉर्म पर बॉक्स में \r\n युक्त टेक्स्ट डालता हूं, तो \r\n\n में बदल जाता है।

मेरे प्रश्न: क्या इस व्यवहार के लिए कोई कारण है (\r\n ->\n)? क्या यह व्यवहार कहीं दस्तावेज है? क्या मैं इस पर हमेशा इस तरह से भरोसा कर सकता हूं?

जिस मामले में मैंने यहां पोस्ट किया है, वह एक समस्या के निचले हिस्से में पहुंचने का मेरा प्रयास है, जिसमें एक अलग परियोजना में मेरे रूपों में से एक है, इसलिए मैं इस मुद्दे के बारे में किसी भी इनपुट की सराहना करता हूं।

+1

इससे पहले यह याद रखना याद रखें, हालांकि मैंने इसके आसपास हैक किया है: -/ – GreyCloud

उत्तर

7

RichTextBox.Text संपत्ति RichTextBox.Rtf संपत्ति में उल्लिखित आरटीएफ प्रारूप कोड के अनुसार निर्दिष्ट आरटीएफ दस्तावेज़ में निर्दिष्ट स्ट्रिंग को परिवर्तित कर रही है। चूंकि 'आरटीबी' उदाहरण शुरू नहीं किया जा रहा है 'आरटीएफ' प्रारूप कोड खाली हैं, और यह सिर्फ आपके इनपुट को प्रतिबिंबित कर रहा है। 'आरटीबी' शुरू होने के बाद इसमें एक खाली आरटीएफ दस्तावेज़ (प्रारूप कोड के साथ) होता है, जो 'richTextBox1' के समान (और सही) व्यवहार होता है।

परिणाम:

preinit rtb.Rtf : '' 
postinit rtb.Rtf : '"{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs17\\par\r\n}\r\n"' 
richTextBox1.Rtf : '"{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs17\\par\r\n}\r\n"' 
richtextBox1.Rtf with cheese : '"{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs17 Cheese\\par\r\nWhiz\\par\r\n}\r\n"' 

कोड:

void Form1_Load(object sender, EventArgs e) 
{ 
    TestIt(); 
} 
public void TestIt() 
{ 
    string enl = "Cheese" + Environment.NewLine + "Whiz"; 

    RichTextBox rtb = new RichTextBox(); 
    MessageBox.Show("preinit rtb.Rtf : '" + rtb.Rtf + "'"); 
    this.Controls.Add(rtb); 
    MessageBox.Show("postinit rtb.Rtf : '" + rtb.Rtf + "'"); 
    MessageBox.Show("richTextBox1.Rtf : '" + richTextBox1.Rtf + "'"); 

    rtb.Text = enl; 
    string ncr = rtb.Text; 
    MessageBox.Show(string.Format("rtb: {0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
            enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            ncr.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            Environment.NewLine, 
            (enl == ncr), Environment.NewLine, 
            enl.Contains(Environment.NewLine), Environment.NewLine, 
            ncr.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\nWhiz 
    --- 
    False 
    True 
    False 
    */ 
    richTextBox1.Text = enl; 
    MessageBox.Show("richTextBox1.Rtf with cheese : '" + richTextBox1.Rtf + "'"); 
    string ncr2 = richTextBox1.Text; 
    MessageBox.Show(string.Format("richTextBox1: {0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
            enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            ncr2.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            Environment.NewLine, 
            (enl == ncr2), Environment.NewLine, 
            enl.Contains(Environment.NewLine), Environment.NewLine, 
            ncr2.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\nWhiz 
    --- 
    False 
    True 
    False 
    */ 
} 
+3

उत्तर देखने के लिए तत्पर हैं और क्या यह आरटीएफ स्पेक का हिस्सा है कि न्यूलाइन '\ n' हैं? – NickAldwin

+4

मेरा मानना ​​है कि इस तथ्य के साथ और अधिक करना है कि आरटीएफ फ़ाइल वर्णसेट आमतौर पर '\ ansi' और गेटटर द्वारा उपयोग किए गए यूनिकोड कोडपृष्ठ '\ ansicpg1252' है। इनपुट टेक्स्ट में न्यूलाइन को आरटीएफ पैराग्राफ ब्रेक '\ par' आरटीएफ स्पेक के रूप में एन्कोड किया गया है और यूनिकोड आरटीएफ कोडपेज द्वारा एक नई लाइन के रूप में पुनः उत्सर्जित किया गया है। – mark

+0

उपरोक्त कोड में एक संदेशबॉक्स जोड़ा गया है जो अनुच्छेद एन्कोडिंग प्रदर्शित करता है। – mark

5
var rtb = new RichTextBox(); 
    string enl = "Cheese" + Environment.NewLine + "Whiz"; 
    rtb.Text = enl; 

इस तरह पाठ संपत्ति कार्यों का एक पक्ष प्रभाव है। यह Control.Text में कैश किया गया है, वास्तविक देशी विंडोज नियंत्रण तब तक अपडेट नहीं होता है जब तक यह बनाया नहीं जाता है। समस्या यह है कि आपके आरटीबी के साथ कभी नहीं हुआ। आपने इसे किसी रूप में नहीं जोड़ा है, इसलिए मूल नियंत्रण नहीं बनाया गया था। .NET में विशिष्ट आलसी संसाधन आवंटन पैटर्न। नतीजतन, आप कैश किए गए मान को पढ़ रहे हैं, नियंत्रण से मूल्य नहीं।

इस देखने के लिए, नियंत्रण के लिए मजबूर करने कोड को संशोधित बनाया जाना:

 var rtb = new RichTextBox(); 
     rtb.CreateControl(); 
     string enl = "Cheese" + Environment.NewLine + "Whiz"; 
     rtb.Text = enl; 

और आपको लगता है कि \ r \ देखेंगे n अब \ n अनुवाद किया है। नियंत्रण() नियंत्रण को भूलना मत भूलना।

+4

ठीक है, यह समझ में आता है ... लेकिन मैं अधिक चिंतित था कि '\ r \ n' क्यों बदल दिया गया है \ n'। – NickAldwin

+4

यह ठीक है कि नियंत्रण कैसे काम करता है। आरटीबी पर बहुत लाभ है। –