2009-07-07 27 views
11

tôi đang thiết lập một DataGridViewComboBoxColumn như thế này:Làm cách nào để tôi thiết lập DataGridView ComboBoxColumn bằng một DataSource khác trong mỗi ô?

var newColumn = new DataGridViewComboBoxColumn() { 
    Name = "abc" 
}; 
newColumn.DataSource = new string[] { "a", "b", "c" }; 
dgv.Columns.Add(newColumn); 

này hoạt động: mỗi hàng có một hộp thả xuống trong cột đó, dân cư với a, b, c.

Tuy nhiên, bây giờ tôi muốn cắt danh sách cho các hàng nhất định. Tôi đang cố gắng đặt danh sách cho mỗi hàng như sau:

foreach (DataGridViewRow row in dgv.Rows) { 
    var cell = (DataGridViewComboBoxCell)(row.Cells["abc"]);   
    cell.DataSource = new string[] { "a", "c" };       
} 

Tuy nhiên, mã này không có hiệu lực - mọi hàng vẫn hiển thị "a", "b", "c".

Tôi đã thử thay thế new string[] bằng new List<string>new BindingList<string>, cả hai không có sẵn.

Tôi cũng đã thử xóa mã đặt newColumn.DataSource, nhưng sau đó danh sách trống.

Tôi nên làm như thế nào?

Trả lời

20

Các công trình sau đây cho tôi:

DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn(); 
newColumn.Name = "abc"; 
newColumn.DataSource = new string[] { "a", "b", "c" }; 
dataGridView1.Columns.Add(newColumn); 

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(row.Cells["abc"]); 
    cell.DataSource = new string[] { "a", "c" }; 
} 

Bạn cũng có thể thử (điều này cũng làm việc cho tôi):

for (int row = 0; row < dataGridView1.Rows.Count; row++) 
{ 
    DataGridViewComboBoxCell cell = 
     (DataGridViewComboBoxCell)(dataGridView1.Rows[row].Cells["abc"]); 
    cell.DataSource = new string[] { "f", "g" }; 
} 
+0

Hmm, cũng phù hợp với tôi - trong một dự án thử nghiệm sạch sẽ. Nó phải là một cái gì đó tôi đang làm khác nhau .. – Blorgbeard

+3

Ok, vấn đề là một cái gì đó để làm với thực tế là DataGridView của tôi đã AutoSizeColumnMode thiết lập để AllCells. Tôi nghĩ rằng nó đã được xác nhận giá trị của các tế bào trước khi nguồn dữ liệu của họ được thiết lập (hoặc một cái gì đó). – Blorgbeard

+1

Giúp tôi giải quyết vấn đề! – XXXXX

0

Một lựa chọn khác là cố gắng liên kết dữ liệu vào mức độ liên tiếp. Hãy thử sử dụng sự kiện OnRowDataBound sự kiện. Sau đó, bạn có thể lập trình thiết lập những gì trong hộp kết hợp dựa trên nội dung của hàng đó.

Tất nhiên, điều này giả định bạn đang databinding bạn lưới.

+2

Tôi đang databinding, nhưng đây là winforms, không phải web. winforms datagridview dường như không có sự kiện này .. – Blorgbeard

Các vấn đề liên quan