2010-11-08 27 views
11

Bu DatagridViewComboBox'ta ReadAccess numara üyelerini göstermek için başka neler yapmalıyım?Bir DataGridViewComboBox'ta Enum tipi üyeler nasıl gösterilir?

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;

ve son olarak InitializeComponent(); sonra, ben DataGridView'ın DataSource ayarlıyorum içinde:

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

Bu.Controls.Add (ReadDataGridViewComboBoxColumn) 'veya benzerlerini yaptınız mı? –

+0

@George: evet, elbette ... ama projeyi çalıştırdığımda, açılan kutu donmuş ve listeyi açamıyorum ... –

+0

DataGridView'ı başlatmak için daha fazla kod var mı? –

cevap

21

Bu i' bir sorun burada

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

DataGridView hakkında tasarımcı tarafından oluşturulan kodlar olduğunu ve birçok kez rastlamak. DataGridViewComboBoxColumn, enum'un dize temsili ve integral değeri arasındaki farkı nasıl uzlaştıracağını bilmiyor. Enumun türüne ValueType'u ayarlamanıza rağmen, DataGridView, hücrenin değerini temeldeki int değerine ayarlamaya çalışır - bu nedenle, veri bağlama sırasında FormatException yükseltilir.

Bu sorunun üstesinden gelmeyi bulmamın tek yolu (hücre türünün alt sınıfının kısa olması), DataGridViewComboBoxColumn numaralı dizgeyi, dize değerlerini tamsayı değerlerinden ayıran bir veri kaynağına bağlamaktır. Bu amaçla bir anonim tür kullanabilirsiniz:

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(); 

Bu şekilde, DataGridView onun biçimlendirilmiş değeri ile hücre değerini ilişkilendirmek bilir.

+0

Vay ... gerçekten güzel! çok teşekkürler ... –

+0

@Bradley: Ben hala bununla ilgili problemlerim var ...Açılan kutu hala donmuş ve listeyi açamıyorum ve ayrıca 'FormatException' aldım ... –

+0

@Dr TJ: 'DataGridView' içindeki diğer sütunlardan birinin soruna neden olması mümkün mü? Bunu tamir ettin mi? 'DataError' olayı için işleyicinizdeki 'ColumnIndex 'özelliğini kontrol edin. –

8

Bradly Smith sağlanan cevap ekleme: Kolayca bu kodu kullanarak (yerine tek tek her adlandırma) tüm numaralandırma değerler elde edebilirsiniz:

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

Sen int enum değeri dönüştürmek gerekir. Eğer "Geçersiz değere" gibi bir hata varsa bu kodu kullanın:

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

kabul edilen yanıt An İyileştirme: elle dizi olarak enum üyelerini yazmanız gerek yoktur. Bunun yerine System.Enum.GetValues(typeof(ReadAccess))'u kullanabilirsiniz. Ayrıca, yerine anonim tip listesinin, sen Sözlük (Sözlük veri kaynağı olarak kabul edilmez) bir Listesini kullanabilirsiniz:

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

veya doğrudan KeyValuePair listesi:

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

Yine de gerekli (ancak DisplayMember şimdi "Anahtar"):

ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 
ReadDataGridViewComboBoxColumn.ValueMember = "Value"; 
ReadDataGridViewComboBoxColumn.DisplayMember = "Key";