2009-03-17 15 views
23

मैं एक कस्टम वर्ग के लिए एक DataGridView के भीतर अलग ComboBox कोशिकाओं बाँध, और एक त्रुटिDataGridViewComboBoxCell बाइंडिंग - "मान मान्य नहीं है"

DataGridViewComboBoxCell मूल्य हो रही रखने के लिए कोशिश कर रहा हूँ मान्य नहीं है

मैं वर्तमान में सेल के लिए डेटा स्रोत को IList<ICustomInterface> पर एक शब्दकोश से असाइन कर रहा हूं। डेटा स्रोत को सेट करने पर, ComboBoxCell के लिए अनुक्रमणिका सेट नहीं है, इसलिए इसका एक अवैध मान चुना गया है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे वास्तविक मूल्य चुनने के लिए कैसे प्राप्त किया जाए, उदा। सूची में 0 वें आइटम को इस त्रुटि को हटाने के लिए दिया गया है, या समस्या को हल करने के लिए एक और तरीका खोजें। किसी के पास कोई सुझाव है?

+1

क्या आप कोड पोस्ट कर सकते हैं? – JaredPar

उत्तर

26

मैं प्रश्न पोस्ट करने के बाद लंबे समय तक समाधान ढूंढने में कामयाब रहा। किसी और के लिए:

समस्या यह थी कि मैं किसी ऑब्जेक्ट को DataGridViewComboBoxCell.Value असाइन करने का प्रयास कर रहा था, उम्मीद कर रहा था क्योंकि सेल डेटा स्रोत से बंधे थे क्योंकि यह स्वचालित रूप से स्रोत और अद्यतन में ऑब्जेक्ट को ढूंढ लेगा।

यह वास्तव में मामला नहीं था, आपको वास्तव में मूल्य और बाध्यकारी अद्यतन करने के लिए ValueMember संपत्ति के बराबर मान सेट करने की आवश्यकता है। मेरा मानना ​​है कि मैं ValueMember और DisplayMember (सेल में रेंडर करने के तरीके को नियंत्रित करता है) के लिए एक संपत्ति 'नाम' का उपयोग कर रहा था, इसलिए अधिकांश मामलों के लिए मान को interface.ToString() (इंटरफ़ेस उदाहरण के बजाय) पर सेट करना। फिर मैं किसी भी डेटा एरर अपवादों को पकड़ता और अनदेखा करता हूं जो तब होता है जब मैं स्रोत को बदल रहा हूं।

+3

किसी और के लिए जो इस पर ठोकर खाती है, इसका मतलब है कि ValueMember संपत्ति को सेल मान के बराबर होना चाहिए - DisplayMember वह संबंधित फ़ील्ड है जिसे आप दिखाना चाहते हैं – Chris

3

परीक्षणों के घंटों के बाद, मुझे अंततः एक समाधान मिला जो काम करता है।

// Create a DataGridView 
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView(); 

// Create a DataGridViewComboBoxColumn 
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new 

System.Windows.Forms.DataGridViewComboBoxColumn(); 

// Add the DataGridViewComboBoxColumn to the DataGridView 
dgvCombo.Columns.Add(colCombo); 

// Define a data source somewhere, for instance: 
public enum DataEnum 
{ 
    One, 
    Two, 
    Three 
} 

// Bind the DataGridViewComboBoxColumn to the data source, for instance: 
colCombo.DataSource = Enum.GetNames(typeof(DataEnum)); 

// Create a DataGridViewRow: 
DataGridViewRow row = new DataGridViewRow(); 

// Create a DataGridViewComboBoxCell: 
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell(); 

// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn: 
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum)); 

// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance: 
cellCombo.Value = "Two"; 
// (No need to set values for DisplayMember or ValueMember.) 

// Add the DataGridViewComboBoxCell to the DataGridViewRow: 
row.Cells.Add(cellCombo); 

// Add the DataGridViewRow to the DataGridView: 
dgvCombo.Rows.Add(row); 

// To avoid all the annoying error messages, handle the DataError event of the DataGridView: 
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError); 

void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e) 
{ 
    // (No need to write anything in here) 
} 

यह सब कुछ है।

+1

@NaSo याद रखें! आपको समस्या को ठीक करने की ज़रूरत है, इसे अनदेखा न करें। वैसे, आपने 'cellCombo.DataSource' को बाध्य किया है, जो पूरी तरह से गलत है। वास्तव में 'DataGridViewComboBoxCell.DataSource' स्वचालित रूप से बाध्य हो जाएगा जब आप' DataGridViewComboBoxColumn.DataSource ' – Rzassar

2

मुझे एक ही समस्या थी।

मेरे मामले में समाधान विदेशी कुंजी तालिका के डेटा एडाप्टर को भरना था। यह स्वचालित रूप से भरा नहीं जा रहा था और यह समस्या का कारण था।

Page_Load घटना में:

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes) 
1

मैं एक ही समस्या हो रही है। मेरे कॉम्बोबॉक्स कॉलम को (अनबॉड) डेटाग्रिड में पॉप्युलेट करने के बाद, मैंने DataGridViewComboBoxColumn की ValueMember प्रॉपर्टी को सेट करके अपनी समस्या हल की, जाहिर है, कॉम्बोबॉक्स में ऑब्जेक्ट्स की ToString() प्रॉपर्टी पर निर्भर होना पर्याप्त नहीं है।

वास्तविक कोड:

/// <summary> 
/// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan. 
/// </summary> 
/// <param name="bonus"></param> 
private void PopulateDataGridSplitVolumes(Bonus_Group bonus) 
{ 
    try 
    { 
    List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString); 
    foreach (Qualification qual in qualifications) 
    { 
     DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0]; 
     col.Items.Add(qual);      
    } 
    SplitVolumeGrid_QualificationColumn.ValueMember = "Name"; 
    } 
    catch (Exception ex) 
    { 
#if DEBUG 
    System.Diagnostics.Debugger.Break(); 
#endif 
    throw ex; 
    } 
}//PopulateDataGridSplitVolumes  
0

सेल करने के लिए एक शून्य मान सेट करें:

dataGridView.CurrentRow.Cells[NAME].Value = null; 
9

यहाँ मेरी सरल उपाय जब enums

ColumnType.ValueType = typeof (MyEnum); 
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum)); 

का उपयोग कर आप के तुरंत बाद कर सकते हैं " InitializeComponent(); "

+0

सेट करते हैं तो मेरे मामले में वास्तव में अच्छा काम करता है, धन्यवाद! – peterkodermac

+0

'माईएनम' का मूल्य क्या होना चाहिए? –

+0

enum जो आप अपने combobox में चाहते हैं जो आपके डेटा से मेल खाता है। – Sauleil

0

लोगों के लिए जितना मैंने किया उतना संघर्ष नहीं किया।

कॉम्बो को बाध्य करते समय आप डिस्प्लेमेम्बर (उपयोगकर्ता क्या देखेंगे) सेट कर रहे हैं और वैल्यूमेम्बर (आपका एप्लिकेशन क्या प्राप्त होगा)।

इन्हें स्थापित करने के बाद आपको मूल्य सेट अप करने की आवश्यकता है और यह वह जगह है जहां यह विफल हो जाती है। असल में मूल्य के प्रकार को ValueMember के समान TYPE होना आवश्यक है।

तो यदि आपका मूल्य सदस्य एक आईडी स्पष्ट रूप से इसके प्रकार के आईएनटी है और आपको उदाहरण के लिए int में अपना मान सेट करने की आवश्यकता है। Value = 1 ;.

1

उपयोग DataError ईवेंट हैंडलर,

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) 
     { 
      //You don't have to write anything here ! 
     } 

और अपने DisplayMember और ValueMember डेटा प्रकार एक ही होना चाहिए, मेरे मामले में मैं दोनों के लिए देश का है। सब कुछ मेरे लिए ठीक काम करता है ... !!

0

मुझे एक ही समस्या थी। संदेश पर 100% स्थान था। Combobox के लिए मान इस तरह थे: सटीक, शुरू होता है ... और मैं मूल्य Exactă (सटीक नहीं) सेट करने की कोशिश कर रहा था। यह स्वचालित रूप से हो रहा था क्योंकि मैं DataTridView के लिए DataTable को एक .xml फ़ाइल से DataTable.ReadXml (...) के साथ पढ़ रहा था। .xml फ़ाइल में मान बंद थे।

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