2011-04-21 7 views
8

किसी को भी इस व्याख्या कर सकते हैं:अधिभावी ToString() और करने के लिए ListBox सी # जोड़ने

public class Test : List<int> 
{ 
    public override string ToString() 
    { 
     return "My ToString"; 
    } 
} 

यदि मैं यह दृष्टांत और एक Windows Form पर एक ListBox नियंत्रण में जोड़ने, यह प्रदर्शित करता है "संग्रह" के बजाय "मेरे ToString "।

Test test = new Test(); 
listBox1.Items.Add(test); 

मैंने सोचा था कि Items को जोड़ने सिर्फ मेरी कक्षा के ToString() कहेंगे। निम्न कार्य निश्चित रूप से उम्मीद के रूप में

MessageBox.Show(test.ToString()); 

उत्तर

7

कि के लिए काम करने के लिए आप स्वरूपण को निष्क्रिय करने के लिए है:

listBox1.FormattingEnabled = false; 

ऐसा लगता है कि अगर स्वरूपण सक्षम किया गया है, इसके कुछ जादू के करतब कर की तरह है और परिणाम हमेशा यह क्या होना चाहिए नहीं है ...

+0

यह है। धन्यवाद –

+0

मेरा दिन बनाया :-) – itsho

+0

धन्यवाद ... बेवकूफ जादू – RustyH

0

इसे इस तरह होना जरूरी नहीं है:

listBox1.Items.Add(test.ToString()); 

मुझे लगता है कि आप अपने लिस्टबॉक्स एक स्ट्रिंग प्रकार के होते हैं करना चाहते हैं?

सुनिश्चित नहीं है कि यह सही है, लेकिन मैंने इसका परीक्षण नहीं किया है।

+0

बेशक यह काम करता है - लेकिन जोड़ें() को ऑब्जेक्ट प्राप्त होता है और क्या यह ऑब्जेक्ट.ToString() को वर्चुअल नहीं करता है? यदि मैं ऑब्जेक्ट से प्राप्त करने के लिए अपनी कक्षा बदलता हूं तो यह काम करता है ... –

0

लिस्टबॉक्स में आइटम ऑब्जेक्ट्स का संग्रह हैं, स्ट्रिंग नहीं।

देखें MSDN: ListBox.ObjectCollection.Add Method

इसलिए आप या तो एक स्ट्रिंग (पूर्व: listBox1.Items.Add(test.ToString());) के रूप में उदाहरण के जोड़ने के लिए सामने के छोर पर या बैकएंड पर जब लिस्टबॉक्स पर ध्यान देकर आप ToString कॉल करनी होगी (पूर्व: listBox1.Items[0].ToString();) ।

+0

नहीं - यदि आप सही थे तो एक सूची बॉक्स में int क्यों जोड़ता है? यह ऑब्जेक्ट में वर्चुअल ToString() विधि को कॉल करता है। अगर मैं ऑब्जेक्ट से प्राप्त करने के लिए अपनी कक्षा को चैन करता हूं तो यह भी काम करता है ... –

4

टेस्ट प्रकार की संपत्ति को ListBox पर DisplayMember सेट करें।

listBox1.DisplayMember = "Name"; 

अपनी समस्या को हल करने के लिए, एक संपत्ति बुलाया "नाम" टाइप करें और गेटर कॉल ToString में जोड़ें।

public class Test : List<Int32> 
{ 
    public String Name { get { return this.ToString(); } } 

    public override string ToString() 
    { 
     return "Test"; 
    } 
} 
+0

हां मुझे यह भी पता है ... प्रश्न यह है कि Listbox.items.add क्यों नहीं है मेरा ओवरराइड टूस्ट्रिंग()? –

0

मैं भी इस पर आया (और एक और धन्यवाद वहाँ मनजी!)। मैं कुछ इस तरह था:

public override string ToString() 
    { 
     return MessageText; 
    } 

कहाँ MessageText कई अन्य लोगों के बीच एक पाठ क्षेत्र था, और यह ठीक काम किया। बाद में मैं इसे इस

public override string ToString() 
    { 
     return string.Concat("[", MessageTime.ToString("yyyy-MM-dd HH:mm:ss.fffff"), "] ", MessageText); 
    } 

करने के लिए बदल और यह अभी भी सिर्फ MessageText खाने में सामग्री (बाल खींच समय) लौट आते हैं। दिलचस्प बात यह थी कि लिस्टबॉक्स I पर एक संदर्भ मेनू ने क्लिपबोर्ड पर चयनित आइटम कॉपी करने के लिए सेट अप किया था, पूर्ण ToString ओवरराइड का उपयोग किया था।

व्यक्तिगत रूप से मुझे लगता है कि स्वरूपण सक्षम संपत्ति को सत्य के बजाय गलत पर डिफ़ॉल्ट होना चाहिए, मुझे लगता है कि मैं अक्सर स्मार्ट होने की कोशिश कर आईडीई (या नियंत्रण सेटिंग्स) द्वारा पकड़ा जाता हूं।

/// संपादित करें: टाइपो (कोहनी के साथ टाइप न करना याद रखना चाहिए!

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