2011-10-05 10 views
5

मैं DataGridView में कुछ सेट अप करने का प्रयास कर रहा हूं। ऐसा लगता है कि यह बहुत सरल होना चाहिए लेकिन मुझे परेशानी हो रही है।DataGridViewComboBoxColumn डेटासोर्स?

  • CodeID
  • कोडनेम
  • TypeName की DisplayMember, TypeID

की ValueMember के साथ ComboBox मैं TypeName के सभी संभव मूल्यों से चयन करने के लिए सक्षम होना चाहते हैं: मैं तीन कॉलम प्रदर्शित करना चाहते हैं।

अगर मैं एक DataTable में यह सब लोड और DataSource रूप DataGridView निर्धारित करते हैं, मुझे लगता है कि रिकार्ड के लिए मौजूदा TypeName प्रदर्शित कर सकते हैं, लेकिन कॉम्बो बॉक्स किसी अन्य मान शामिल नहीं होगा: यहाँ मेरी दुविधा है। यदि मैंने DataGridViewComboBoxColumn के लिए एक अलग DataTable पर सेट किया है जिसमें सभी संभव TypeNames शामिल हैं, तो मौजूदा मान प्रदर्शित नहीं होता है।

DataGridView वास्तव में काम करने के लिए परेशान है या तो इसके लिए एक समाधान या व्यवहार्य विकल्प की सराहना की जाएगी।

संपादित करें: ऐसा लगता है कि यह समस्या DisplayMember और ValueMember के लिए एक अलग आइटम रखने की इच्छा के कारण होती है। निम्नलिखित काम करता है, मैं स्थापित करने IDValueMember के रूप में के बारे में चिंता है, तो नहीं है:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "Type", 
    DataPropertyName = "Type" 
} 

अगर मैं निम्नलिखित करते हैं, सही प्रकार का चयन किया जाता है, लेकिन मैं कॉम्बो बॉक्स में चयन बदल नहीं कर सकते हैं:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "TypeID", 
    DataPropertyName = "Type" 
} 

ईडीआई:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "TypeID", 
    DataPropertyName = "TypeID" 
} 

अगर मैं निम्नलिखित का उपयोग मैं एक FormatException त्रुटि के रूप में यह पॉप्युलेट करने के लिए कोशिश कर रहा है मिल टी: typeList एक सरल DataTable निम्नलिखित की आबादी है:

SELECT DISTINCT IT.InsuranceTypeID, IT.[Type] 
FROM InsuranceType IT 
WHERE IT.ClientID = @ClientID 
ORDER BY [Type] 
+0

आप DGVCBC पर DataPropertyName की स्थापना कर रहे हैं? इसके अलावा, महाकाव्य प्रोफाइल आइकन। http://social.msdn.microsoft।कॉम/मंच/एन-यूएस/Winformsdatacontrols/धागा/952b1cc9-4ba7-4b16-abdf-be2cdfde6460/ –

+0

हाँ ... मेरा संपादन देखें। –

+0

क्या आप पोस्ट कर सकते हैं कि आप 'टाइपलिस्ट' और जिस संरचना को आप सूची में जोड़ रहे हैं उसे सेटअप करते हैं? 'DataPropertyName' और' ValueMember' के प्रकार समान होना चाहिए, शायद यही कारण है कि आपको अंतिम उदाहरण में अपवाद क्यों मिल रहा है। – SwDevMan81

उत्तर

3

ठीक है, मैं एक उदाहरण ClientInfo और InsuranceDetails मुझे लगता है कि नकल हो सकता है के साथ आया था क्या आप करने की कोशिश कर रहे हैं। अगर ये विवरण बिल्कुल सही नहीं हैं तो मुझे बताएं। इस उदाहरण DataGridViewComboBox पॉप्युलेट और मूल्य InsuranceDetails (विशेष रूप से: InsurDetailz = all_insurance_types[2]) के आधार पर सेट हो जाएगा

public partial class Form1 : Form 
    { 
     private ClientInfo _myClient; 
     private BindingList<InsuranceDetails> all_insurance_types = 
     new BindingList<InsuranceDetails>(); 

     public Form1() 
     { 
     InitializeComponent(); 

     DataGridView grid = new DataGridView(); 
     grid.Dock = DockStyle.Fill; 
     grid.AutoGenerateColumns = true; 

     all_insurance_types.Add(new InsuranceDetails(1, "Health")); 
     all_insurance_types.Add(new InsuranceDetails(2, "Home")); 
     all_insurance_types.Add(new InsuranceDetails(3, "Life")); 

     var col = new DataGridViewComboBoxColumn 
     { 
      DataSource = all_insurance_types, 
      HeaderText = "Insurance Type", 
      DataPropertyName = "InsurDetailz", 
      DisplayMember = "ItType", 
      ValueMember = "Self", 
     }; 

     _myClient = new ClientInfo { 
      InsurDetailz = all_insurance_types[2], Name = "Jimbo" }; 
     grid.Columns.Add(col); 
     grid.DataSource = new BindingList<ClientInfo> { _myClient }; 
     this.Controls.Add(grid); 

     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
     } 

     void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
     // make sure its updated 
     InsuranceDetails c = _myClient.InsurDetailz; 
     string name = _myClient.Name; 
     // Place breakpoint here to see the changes in _myClient 
     throw new NotImplementedException(); 
     } 
    } 

    class ClientInfo 
    { 
     public string Name { get; set; } 
     public InsuranceDetails InsurDetailz { get; set; } 
    } 

    class InsuranceDetails 
    { 
     public int InsuranceTypeID { get; set; } 
     public String ItType { get; set; } 
     public InsuranceDetails Self { get { return this; } } 

     public InsuranceDetails(int typeId, String itType) 
     { 
     this.InsuranceTypeID = typeId; 
     this.ItType = itType; 
     } 
    } 
+0

रहस्य 'स्वयं' संपत्ति है। –

5

मैं एक ऐसी ही (मुझे लगता है कि) मुद्दा था, और मेरे लिए समाधान DataSource के लिए सेटिंग से पहले DataGridViewComboBoxColumnके लिए DataSource स्थापित करने के लिए था DataGridView

मेरे मामले में, मेरा datasources एक List<T> और एक BindingList<T> क्रमशः हैं, लेकिन यह DataTables के साथ एक ही काम करना चाहिए:

DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"]; 
categoryColumn.DataSource = categories; 

_ItemsGrid.DataSource = items; 
+0

दुर्भाग्यवश इससे मदद नहीं मिली। –

+0

इससे एलोक्वेरा का उपयोग करते समय मुझे कुछ जटिल वर्ग को एक डाटाग्रिड में बाध्य करने में मदद मिली। धन्यवाद! – Sverker84

+0

यह मेरे लिए काम किया। धन्यवाद! –