2010-11-08 15 views
11

इस डेटाग्रिड व्यूम्बोबॉक्स में ReadAccess enum सदस्यों को दिखाने के लिए मुझे और क्या करना है?DataGridViewComboBox में एनम प्रकार के सदस्यों को कैसे दिखाएं?

this.rolesDataGridView.AutoGenerateColumns = false; 
this.rolesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
this.TableNameDataGridViewTextBoxColumn, 
this.ReadDataGridViewComboBoxColumn, 
this.WriteDataGridViewComboBoxColumn, 
this.ReadCodeDataGridViewComboBoxColumn, 
this.ProcessDataGridViewCheckBoxColumn, 
this.AdministrateDataGridViewCheckBoxColumn}); 
this.rolesDataGridView.DataSource = this.bsTablePermissions;

और अंत में, InitializeComponent(); के बाद, मैं DataGridView के डेटास्रोत सेट कर रहा हूं में:

this.rolesDataGridView.DataSource = this.RoleTablePermissions; // a bindingsource list
+0

क्या आपने यह किया है। नियंत्रण। जोड़ें (ReadDataGridViewComboBoxColumn) 'या इसी तरह? –

+0

@ जॉर्ज: हाँ, यकीन है ... लेकिन जब मैं प्रोजेक्ट चलाता हूं, कॉम्बो बॉक्स जमे हुए है और मैं इसकी सूची नहीं खोल सकता ... –

+0

क्या इस डेटा की तुलना में DataGridView को तुरंत चालू करने के लिए और कोड है? –

उत्तर

21

यह एक समस्या i 'है

ReadDataGridViewComboBoxColumn.Items.Clear(); 
ReadDataGridViewComboBoxColumn.Items.AddRange(ReadAccess.None, ReadAccess.Allowed); 
ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 

यहां डिजाइनर उत्पन्न DataGridView के बारे में कोड है कई बार आ गया है। DataGridViewComboBoxColumn एनम के स्ट्रिंग प्रस्तुति और इसके अभिन्न मूल्य के बीच अंतर को सुलझाने का तरीका नहीं जानता है। भले ही आप ValueType को enum के प्रकार पर सेट करते हैं, DataGridView सेल के मान को अंतर्निहित int मान पर सेट करने का प्रयास करेगा - यही कारण है कि FormatException डाटाबेसिंग के दौरान उठाया जाएगा।

इस समस्या को दूर करने के लिए मुझे एकमात्र तरीका मिला है (सेल प्रकार को उप-वर्गीकृत करने से कम) डेटा स्रोत पर DataGridViewComboBoxColumn को बांधना है जो स्ट्रिंग मानों को पूर्णांक मानों से अलग करता है। आप इस उद्देश्य के लिए एक गुमनाम प्रकार का उपयोग कर सकते हैं:

ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 
ReadDataGridViewComboBoxColumn.ValueMember = "Value"; 
ReadDataGridViewComboBoxColumn.DisplayMember = "Display"; 
ReadDataGridViewComboBoxColumn.DataSource = new ReadAccess[] 
    { ReadAccess.None, ReadAccess.Allowed } 
    .Select(value => new { Display=value.ToString(), Value=(int)value }) 
    .ToList(); 

इस तरह, DataGridView जानता है कि कैसे अपने स्वरूपित मूल्य के साथ सेल मूल्य से संबंधित।

+0

वाह ... वास्तव में अच्छा! बहुत बहुत धन्यवाद ... –

+0

@ ब्रैडली: मुझे अभी भी इस समस्या है ...कॉम्बो बॉक्स अभी भी जमे हुए है और मैं सूची भी नहीं खोल सकता और मुझे 'FormatException' ... –

+0

@Dr TJ प्राप्त होता है: क्या यह संभव है कि आपके' DataGridView' के अन्य कॉलम में से कोई समस्या हो रही है, अब कि आपने इसे ठीक कर दिया है? 'DataError' ईवेंट के लिए अपने हैंडलर में 'कॉलम इंडेक्स' प्रॉपर्टी देखें। –

8

जवाब Bradly स्मिथ प्रदान की को जोड़ना: एक सब Enum मान आसानी से इस कोड का उपयोग (बजाय प्रत्येक व्यक्तिगत रूप से नामकरण के) प्राप्त कर सकते हैं:

ReadDataGridViewComboBoxColumn.DataSource = 
     new List<ReadAccess>((ReadAccess[]) Enum.GetValues(typeof(ReadAccess))) 
     .Select(value => new { Display=value.ToString(), Value=(int)value }) 
     .ToList(); 
2

आप पूर्णांक के लिए enum मूल्य परिवर्तित नहीं करना चाहिए। यदि आप "अमान्य मान" की तरह एक त्रुटि है इस कोड का उपयोग करें:

ReadDataGridViewComboBoxColumn.DataSource = new ReadAccess[] 
{ ReadAccess.None, ReadAccess.Allowed } 
.Select(value => new { Display=value.ToString(), Value=value }) 
.ToList(); 
0

स्वीकार किए जाते हैं जवाब देने के लिए एक सुधार: मैन्युअल सरणी के रूप में enum सदस्यों टाइप करने के लिए कोई जरूरत नहीं है। इसके बजाय आप System.Enum.GetValues(typeof(ReadAccess)) का उपयोग कर सकते हैं। इसके अलावा, गुमनाम प्रकार सूची के बजाय, आप एक सूची शब्दकोश (शब्दकोश डेटा स्रोत के रूप में स्वीकार नहीं किया है) से उपयोग कर सकते हैं:

ReadDataGridViewComboBoxColumn.DataSource= System.Enum.GetValues(typeof(ReadAccess)) 
    .Cast<Enum>.ToDictionary<string, Enum>((e) => e.ToString(), (e) => e).ToList; 

या सीधे एक KeyValuePair सूची:

ReadDataGridViewComboBoxColumn.DataSource = System.Enum.GetValues(typeof(ReadAccess)) 
    .Cast<Enum>.Select((value) => new KeyValuePair<string, enum>(value.ToString(), (value))); 

अभी भी आवश्यक है (लेकिन डिस्प्लेमेम्बर अब "कुंजी"):

ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 
ReadDataGridViewComboBoxColumn.ValueMember = "Value"; 
ReadDataGridViewComboBoxColumn.DisplayMember = "Key"; 
संबंधित मुद्दे