2011-10-15 38 views
5

Tôi cần một cách để tôi có thể xác định loại cột tại thời gian chạy.Xác định DataGridView Loại cột Lập trình

Đây là mã của tôi:

foreach (DataGridViewColumn column in this.dataGrid.Columns) 
{ 
??? 
//i.e. column.type = checkbox 
} 

Làm thế nào tôi có thể xác định loại cột trong vòng lặp foreach này?

+0

BTW, xem http: //meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –

+0

@JohnSaunders Cảm ơn, nhưng có giải pháp nào không? – funerr

+0

Nếu tôi biết câu trả lời, tôi sẽ trả lời. –

Trả lời

8

Tôi không chắc chắn 100% tôi hiểu bạn hỏi, nhưng bạn có thể chỉ định các loại cột khi bạn tạo cột:

foreach (var definition in columnDefinitions) // Some list of what the column types are 
{ 
    var columnSpec = new DataColumn 
     { 
      DataType = definition.Type, // This is of type System.Type 
      ColumnName = defintion.Name // This is of type string 
     }; 

    this.dataGrid.Columns.Add(columnSpec); 
} 

Nếu bạn cần thay đổi kiểu khi nó đã được tạo ra - bạn không thể làm điều đó. Điều tốt nhất bạn có thể làm là xóa các cột và tạo lại chúng với các loại mới.

2

Bạn không thể thay đổi loại cột DataGridView sau khi được tạo nhưng không có gì ngăn bạn tạo cột khi cần tại thời gian chạy.

Vì vậy, tùy thuộc vào logic xác định loại của từng cột, bạn tạo cột khi cần và thêm chúng vào DataGridView.

Một ví dụ của việc tạo ra một cột hộp kiểm dưới:

DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn() 
dataGridView1.Columns.Add(col); 

Nếu không có thêm bất kỳ thông tin về những quyết định loại cột của bạn rất khó để đưa ra lời khuyên hơn, nhưng bạn có thể dễ dàng sử dụng kỹ thuật này với một DataTable, kiểm tra loại của mỗi cột của nó, hoặc thậm chí sử dụng sự phản chiếu trên một đối tượng mà bạn đang ràng buộc datagridview.

1

bạn có thể gán cột nút cũng và bạn có thể gán thuộc tính cũng như thế này

DataGridViewButtonColumn column = new DataGridViewButtonColumn(); 
    datagridview1.Columns.Add(column); 
    column.FlatStyle = FlatStyle.System; 
    column.DefaultCellStyle.ForeColor = Color.ForestGreen;   
5

Nếu chúng ta xem xét ví dụ của bạn;

foreach (DataGridViewColumn column in this.dataGrid.Columns) 
{ 
    column.ValueType = typeof(DateTime); 
} 

Nhưng, giả sử bạn không muốn tất cả các cột trong chế độ xem dữ liệu của bạn cùng loại;

this.datagrid.Columns[0].ValueType = typeof(Int32); 
this.datagrid.Columns[1].ValueType = typeof(String); 
this.datagrid.Columns[2].ValueType = typeof(DateTime); 

Điều này đặc biệt hữu ích khi bạn đang sử dụng nguồn dữ liệu và không thêm cột của riêng bạn theo chương trình.

2

Tôi giả sử bạn có nghĩa là khi bạn tạo DataGridView. Trong trường hợp đó bạn có thể định nghĩa nó trong một DataTable và móc nó lên đến Datasource của DGV:

Ví dụ:

var columns = new List<Tuple<string, string>>(); 
columns.Add(new Tuple<string, string>("Name", "System.String")); 
columns.Add(new Tuple<string, string>("Selected", "System.Boolean")); 
columns.Add(new Tuple<string, string>("Id", "System.Int32")); 
var table = new DataTable(); 
columns.ForEach(c => table.Columns.Add(new DataColumn(c.Item1) { DataType = Type.GetType(c.Item2) })); 
var dgv = new DataGridView(); 
dgv.DataSource = table; 
0

Giả sử your'e sử dụng BindingSource

var cbox = new DataGridViewCheckBoxColumn // Modify column type 
{ 
    AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, 
    DataPropertyName = dgv.Columns["ColumnWantToChange"].Name, 
    HeaderText = "SOME HEADER NAME" 
}; 
dgv.Columns.Add(cbox); // Add new 
var r = dgv.Columns.OfType<DataGridViewTextBoxColumn>().Where(x => x.Name == "ColumnWantToChange").FirstOrDefault(); 
dgv.Columns.Remove(r); // Remove the original column 
Các vấn đề liên quan