2011-06-03 21 views
6

मैं एक comboboxlist में डेटा जोड़ना चाहता हूं लेकिन यह करने के लिए सही तरीके से अनिश्चित हूं। डेटा एक कच्चे एसक्यूएल कथन से आता है।कॉम्बोबॉक्स में डेटा जोड़ना (बाध्य डेटा नहीं)

मैंने डेटाबेस से सीधे बाध्यकारी डेटा देखा है, लेकिन यह स्पष्ट नहीं है कि यह सभी बाध्यकारी और डेटासेट मेरे लिए कैसे काम करते हैं, इसलिए मैंने इसे छोड़ने और डेटा को स्वयं को (आपकी सहायता से) में डालने का निर्णय लिया है।

कोड मैं ऑनलाइन देख निम्नलिखित प्रकार है:

public partial class Form1 : Form { 
    // Content item for the combo box 
    private class Item { 
     public string Name; 
     public int Value; 
     public Item(string name, int value) { 
      Name = name; Value = value; 
     } 
     public override string ToString() { 
      // Generates the text shown in the combo box 
      return Name; 
     } 
    } 
    public Form1() { 
     InitializeComponent(); 
     // Put some stuff in the combo box 
     comboBox1.Items.Add(new Item("Blue", 1)); 
     comboBox1.Items.Add(new Item("Red", 2)); 
     comboBox1.Items.Add(new Item("Nobugz", 666)); 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { 
     // Display the Value property 
     Item itm = (Item)comboBox1.SelectedItem; 
     Console.WriteLine("{0}, {1}", itm.Name, itm.Value); 
    } 
} 

आप वास्तव में सिर्फ एक combobox को डेटा जोड़ने के लिए करने के लिए एक नया वर्ग पैदा करने के लिए है? इसके अलावा, ऊपर तकनीक का उपयोग कर मेरी कोड लगता है: समस्या

while (rdata.Read()){ 
     String Name = (String)rdata["vetName"]; 
     Name = Name.Trim(); 
     String Surname = (String)rdata["vetSurname"]; 
     Surname = Surname.Trim(); 

     String id = rdata["vetID"].ToString().Trim(); 

     MessageBox.Show("ID " + id); 

     int value1 = Convert.ToInt32(id); 
     MessageBox.Show("value1 " + value1); 

     String display = (String)Name + " " + Surname; 

     editVetComboBox.Items.Add(new Item(display, 2)); 
    } 

कि जब तक बता गया firstname और उपनाम मूल्य (आईडी) के साथ से भर जाता है में नहीं जोड़ा जाता है।

कोई विचार?

कई धन्यवाद, रिचर्ड

+1

निम्नलिखित अपने कोड से में चयनित मान प्राप्त कर सकते हैं मूल्य की तरह लगता है हमेशा 2. यह लिखने में कोई त्रुटि है है? –

+0

एक साइड नोट के रूप में, इस तरह के एक प्रश्न का उत्तर देना आम तौर पर जानकारी के लिए सुविधाजनक होता है कि कोड रनटाइम में कैसे व्यवहार करता है (जैसे कि मैं इसे डीबग कर दूंगा)। आपके पास कई संदेश बॉक्स और 'कंसोल। राइटलाइन' है जो आपको ऐसी जानकारी देता है लेकिन आप इसे हमें नहीं देते हैं।ऐसे प्रश्न का उत्तर देना आसान है यदि कोड में टिप्पणियां हैं जैसे // // यहां मेरे पास सही मूल्य 6' है और // // किसी कारण से यहां मूल्य 1243' – Snowbear

+0

है हाय एलेक्स, हाँ मैंने वहां मूल्य 2 डाल दिया है सिर्फ परीक्षण के लिए लेकिन मान जोड़ा नहीं गया है। – DevilCode

उत्तर

8

स्रोत: http://tipsntricksbd.blogspot.com/2007/12/combobox-is-one-of-most-common-gui.html

ComboBox सबसे में से एक है सामान्य जीयूआई तत्व। इसका उपयोग उपयोगकर्ता को सूची से किसी आइटम को चुनने या एक नया टेक्स्ट दर्ज करने की सुविधा प्रदान करने के लिए किया जाता है। यहां मैं आपको माइक्रोसॉफ्ट विजुअल स्टूडियो .NET 2005 का उपयोग कर सी # में कॉम्बोबॉक्स की कुछ सामान्य और उपयोगी कार्यक्षमताओं को दिखाऊंगा।

सरल ComboBox:

सामान्य स्थिति में, हम following-

myComboBox.Items.Add("Bangladesh"); 
myComboBox.Items.Add("India"); 
myComboBox.Items.Add("Pakistan"); 
myComboBox.Items.Add("Srilanka"); 
myComboBox.Items.Add("Maldives"); 
myComboBox.Items.Add("Nepal"); 
myComboBox.Items.Add("Bhutan"); 

सॉर्ट की गई सूची की तरह सूची में कुछ तार जोड़ने:

आम तौर पर उन है कि उम्मीद विकल्प क्रमबद्ध क्रम में दिखाए जाएंगे। इस प्रयोजन के लिए, हम code-

की एक पंक्ति जोड़ने के लिए
myComboBox.Sorted = true; 

DropDownStyle:

ComboBox में, उपयोगकर्ता एक लेख डाल सकते हैं या तो या सिर्फ सूची से किसी आइटम का चयन। इसलिए डेवलपर को अपनी शैली निर्धारित करनी चाहिए। इसमें 3 विकल्प उपलब्ध हैं:

ComboBoxStyle.DropDownList: User can just select one item from a list. 
ComboBoxStyle.DropDown: User can either type a text or select an item from list. 
ComboBoxStyle.Simple: User can only type a text in text box. Item list is not shown. 

उदाहरण:

myComboBox.DropDownStyle = ComboBoxStyle.DropDown; 

Suggesstion/शब्दकोश:

एक उपयोगकर्ता एक पाठ प्रवेश करती है, वह/वह खुश हो जाता है, तो कुछ सुझाव हैं टाइपिंग के समय कॉम्बो बॉक्स के नीचे दिखाया गया है।

प्रोग्रामर इसी मूल्य (नहीं के लिए चुने गए एक मामले में जहां उपयोगकर्ता कुछ पठनीय पाठ का चयन करता है वहाँ सकता है, लेकिन हो सकता है: इस कार्यक्षमता के लिए, हम लाइनों

myComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; 
myComboBox.AutoCompleteMode = AutoCompleteMode.Suggest; 

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

हम नाम और मूल्य वाले ऑब्जेक्ट को जोड़कर ऐसा कर सकते हैं।

class ComboBoxItem 
{ 
public string Name; 
public int Value; 
public ComboBoxItem(string Name, int Value) 
{ 
this.Name = Name; 
this.Value = Value; 
} 
} 


myComboBox.Items.Add(new ComboBoxItem("Ashis Saha",1)); 
myComboBox.Items.Add(new ComboBoxItem("Subrata Roy", 2)); 
myComboBox.Items.Add(new ComboBoxItem("Aminul Islam", 3)); 
myComboBox.Items.Add(new ComboBoxItem("Shakibul Alam", 4)); 
myComboBox.Items.Add(new ComboBoxItem("Tanvir Ahmed", 5)); 

लेकिन यदि आप अभी ComboBox की सूची देखें, तो आप उस सभी आइटम एक ही हैं और वे उन वस्तुओं के वर्ग नाम हैं देखेंगे। वास्तव में, आइटम उन वस्तुओं के ToString() फ़ंक्शन के आउटपुट के अलावा कुछ भी नहीं हैं। तो अगर हम हमारी अपेक्षा के रूप में व्यवहार करने के लिए ToString() फ़ंक्शन को ओवरराइड करते हैं, तो हम कर रहे हैं।

class ComboBoxItem 
{ 
public string Name; 
public int Value; 
public ComboBoxItem(string Name, int Value) 
{ 
this.Name = Name; 
this.Value = Value; 
} 

// override ToString() function 
public override string ToString() 
{ 
return this.Name; 
} 
} 

आप रास्ता

int selectedValue = ((ComboBoxItem)myComboBox.SelectedItem).Value; 
+0

यदि उपयोगकर्ता ने सूची से संबंधित आइटम का चयन किये बिना "शाकिबुल आलम" लिखा है तो आपको आईडी = 4 कैसे मिलता है? क्या आप एक शब्दकोश (मान, आईडी) का उपयोग करते हैं या आप लूप के लिए बनाते हैं? (ऐसा इसलिए है क्योंकि myComboBox.IndexOf (myComboBox.Text) स्पष्ट रूप से हमेशा वापस आ जाता है -1) धन्यवाद – Fil

+0

यह मेरी मदद करता है। –

1

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

यदि आप जो भी करने जा रहे हैं, वह स्ट्रिंग ऑपरेशंस कर रहा है और प्रत्येक समय कक्षा पर ToString() का उपयोग कर, व्यक्तिगत गुणों तक नहीं पहुंच रहा है, कोई बात नहीं है इसे तब करने में - बस इसे एक स्ट्रिंग में प्रारूपित करें और इसका उपयोग करें।

+0

स्पष्टीकरण के लिए, मैं combobox में कोई वैल्यू नहीं जोड़ सकता जो इस मामले में आईडी है। स्टिंग नाम + उपनाम ठीक दिखता है। ऐसा करने के लिए गैर वर्ग तरीका क्या है? – DevilCode

1

मैं देख सकता हूं कि यह मान आपके कोड में हमेशा 2 है। यह आपके पास मुद्दा हो सकता है।

इसके अलावा, अपने कोड एक छोटे से सरल करने के लिए करने की कोशिश की:

while (rdata.Read()) 
{ 
    string name = (string)rdata["vetName"]; 
    string surname = (string)rdata["vetSurname"]; 
    int id = (int)rdata["vetID"]; 
    string display = name.Trim() + " " + surname.Trim(); 
    editVetComboBox.Items.Add(new Item(display, id)); 
} 

मान लिया जाये कि vetID integer है और सभी सूचीबद्ध क्षेत्रों डेटाबेस में नल नहीं हैं।

+0

मुझे लगता है कि 'स्ट्रिंग नाम = rdata ["vetName"]। ToString()। ट्रिम();' अधिक पठनीय है। लेकिन बस कह रहा है, यह एक +1 है ... – Andre

+0

@Andre 'rdata [" vetName "]' में पहले से स्ट्रिंग ऑब्जेक्ट होगा यदि यह शून्य क्षेत्र नहीं है। यदि यह स्ट्रिंग के रूप में आपको 'rdata ["vetName"] करने की आवश्यकता है, तो यह शून्य से है। –

+0

मैं डेटा को ठीक से प्राप्त कर सकता हूं, यह शून्य-सक्षम नहीं है। कम्बोबॉक्स में आइटम जोड़ने की प्रक्रिया सिर्फ एक मिशन की तरह लगती है .... – DevilCode

0

नहीं, आपको अपनी कक्षा बनाने की ज़रूरत नहीं है ... लेकिन यह आपके द्वारा किए जा रहे कार्यों के साथ समझ में आता है। आपके आवेदन में, कक्षा का प्रकार आपके डेटाबेस इकाई का प्रतिनिधित्व करना एक अच्छा विचार है। अपनी इकाई वर्ग की ToString() विधि को ओवरराइड करें। इसके बाद, इन वर्ग प्रकारों को सीधे कॉम्बोबॉक्स में डालें। कॉम्बोबॉक्स पाठ को प्रदर्शित करने के लिए आपकी इकाई पर ToString() को कॉल करेगा।

यहाँ यह कैसा लगेगा है:

public class Vet 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string SurName { get; set; } 

    public Vet() 
    { 
     // default constructor 
    } 

    public Vet(IDataRecord record) 
    { 
     ID = (int) record["vetid"]; 
     Name = (string) record["vetname"]; 
     SurName = (string) record["vetsurname"]; 
    } 

    public override string ToString() 
    { 
     return Name + " " + SurName; 
    } 
} 

इसके बाद, उदाहरणों सीधे अपने कॉम्बो बॉक्स में जोड़ने के लिए:

comboBox.Items.Clear(); 
while(rdata.Read()) 
{ 
    comboBox.Items.Add(new Vet(rdata)); 
} 
+0

यहां यह आईडी एक आईएनटी होगी। लेकिन यह combobox को कैसे सौंपा गया है कि फ़ंक्शन केवल एक स्ट्रिंग (नाम + उपनाम) देता है। – DevilCode

+0

इस मामले में ToString() के ओवरराइड इस मामले में कुछ भी कैसे करते हैं? क्या इसे कास्ट var = (स्ट्रिंग) रिकॉर्ड ["vetsurname"] के दौरान बुलाया जाता है; ठीक है शायद इस सवाल से पूछने का एक बेहतर तरीका है कि मैं एक कंबोबॉक्स में दिखाई देने के लिए "200" के संबंधित मान के साथ स्ट्रिंग "हैलो वर्ल्ड" जोड़ना चाहता हूं। ऐसा करने का सबसे आसान तरीका क्या है: combobox.Items.Add ("हैलो वर्ल्ड", 200); <---- ऐसा कुछ भी? – DevilCode

+0

जब आप किसी ऑब्जेक्टॉक्स में कोई ऑब्जेक्ट जोड़ते हैं, तो डिस्प्लेक्स डिस्प्ले टेक्स्ट प्राप्त करने के लिए प्रत्येक आइटम पर ToString() को कॉल करेगा। कक्षा के प्रकार में, आप जो भी चाहें ToString() वापस कर सकते हैं। यहां, मैंने इसे 'नाम + उपनाम' वापस कर दिया है। अगर आप इसे कुछ और वापस करना चाहते हैं, तो बस इसे ToString() के रिटर्न स्टेटमेंट में निर्दिष्ट करें। –

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