2010-11-08 42 views
11

Tôi còn phải làm gì khác để hiển thị ReadAccess thành viên enum trong DatagridViewComboBox này?Làm thế nào để hiển thị các thành viên loại Enum trong một DataGridViewComboBox?

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

đây là mã thiết kế tạo về DataGridView:

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;

và cuối cùng, trong khi InitializeComponent();, tôi đang thiết DataGridView của DataSource:

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

Bạn đã thực hiện 'this.Controls.Add (ReadDataGridViewComboBoxColumn)' hoặc tương tự? –

+0

@George: vâng, chắc chắn ... nhưng khi tôi chạy dự án, hộp kết hợp bị đóng băng và tôi không thể mở danh sách của nó ... –

+0

Có mã nào khác để khởi tạo DataGridView không? –

Trả lời

21

Đây là vấn đề i' đã đi qua nhiều lần. Các DataGridViewComboBoxColumn không biết làm thế nào để hòa giải sự khác biệt giữa đại diện chuỗi của enum và giá trị tích phân của nó. Mặc dù bạn đặt ValueType thành loại enum, DataGridView sẽ cố gắng đặt giá trị của ô thành giá trị int bên dưới - đây là lý do tại sao một số FormatException sẽ được tăng lên trong quá trình kết nối dữ liệu.

Cách duy nhất tôi đã tìm thấy để khắc phục sự cố này (viết tắt của phân lớp kiểu ô) là ràng buộc DataGridViewComboBoxColumn với nguồn dữ liệu tách giá trị chuỗi khỏi giá trị số nguyên. Bạn có thể sử dụng một loại vô danh cho mục đích này:

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

Bằng cách này, DataGridView biết làm thế nào để liên hệ giá trị di động với giá trị được định dạng của nó.

+0

wow ... thực sự tốt đẹp! cảm ơn rất nhiều ... –

+0

@ Bradley: Tôi vẫn gặp vấn đề với điều này ...Hộp Combo vẫn còn đóng băng và tôi không thể mở danh sách và cũng có thể, tôi nhận được 'FormatException' ... –

+0

@Dr TJ: Có thể một trong các cột khác trong' DataGridView' đang gây ra sự cố, bây giờ bạn đã sửa lỗi này? Kiểm tra thuộc tính 'ColumnIndex' trong trình xử lý của bạn cho sự kiện' DataError'. –

8

Thêm vào câu trả lời Bradly Smith cung cấp: Người ta có thể nhận được tất cả các giá trị Enum (thay vì đặt tên mỗi cá nhân) dễ dàng sử dụng mã này:

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

Bạn không nên chuyển đổi giá trị enum vào int. Sử dụng mã này nếu bạn có một lỗi như "giá trị không hợp lệ":

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

một sự cải tiến để trả lời chấp nhận: Không cần phải gõ các thành viên enum như mảng bằng tay. Thay vào đó, bạn có thể sử dụng System.Enum.GetValues(typeof(ReadAccess)). Ngoài ra, thay vì danh sách loại vô danh, bạn có thể sử dụng một danh sách từ điển (điển không được chấp nhận như nguồn dữ liệu):

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

hoặc trực tiếp một danh sách KeyValuePair:

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

Vẫn còn cần thiết (nhưng DisplayMember bây giờ là "Key"):

ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 
ReadDataGridViewComboBoxColumn.ValueMember = "Value"; 
ReadDataGridViewComboBoxColumn.DisplayMember = "Key"; 
Các vấn đề liên quan