2011-07-07 5 views
12

Tôi có biểu mẫu với tiện ích DataGridView và tôi cần lấy chỉ mục của cột có tên đã chọn.chỉ mục cột dữ liệu thống kê

Ví dụ: giả sử tôi có bảng có 2 cột: Tên, Họ. Tôi cần một cách để lấy chỉ mục của tên cột. Vấn đề là nó thay đổi tất cả các thời gian tùy thuộc vào DataSource nhưng cột đó luôn có cùng tên "Tên".

Có ai biết cách giải quyết sự cố không?

Trả lời

21

Để lấy một cột DataGridView theo tên bạn chỉ cần tham khảo nó thông qua indexer cột sưu tập:

datagridview1.Columns["columnName"] 

Sau đó, bạn có thể nhận được các chỉ số cột từ cột rằng:

datagridview1.Columns["columnName"].Index; 

Do lưu ý rằng nếu bạn sử dụng tên cột không hợp lệ thì tham chiếu này sẽ trả về null, vì vậy bạn có thể muốn kiểm tra xem tham chiếu cột không phải là null trước khi sử dụng hay sử dụng phương thức thu thập cột .Contains() trước tiên.

+1

Chỉ cần để được an toàn (đối với những người dùng khác), bạn nên kiểm tra xem cột tồn tại đầu tiên: datagridview1 .Columns.Contains ("ColumnName") – ginalster

+0

@ginalster Cảm ơn - điểm tốt, tôi đã thêm vào câu trả lời. –

+1

Làm thế nào đến điều này vẫn không phải là một câu trả lời được chấp nhận? – Neolisk

0

Nếu tôi đúng, e.ColumnIndex cũng sẽ hoạt động cho việc này. bạn có thể kiểm tra các tài liệu MSDN here

0

Bạn có thể lấy chỉ số bằng cách sử dụng the Index property of the DataGridViewColumn widget, như vậy:

ColumnName.Index 

này tránh sự cần thiết để kiểm tra xem tên cột có giá trị trong thời gian chạy vì nó sẽ tạo ra một lỗi biên dịch nếu cột không tồn tại. Điều này cũng làm cho việc tái cấu trúc dễ dàng hơn.

Tôi khuyên bạn nên cung cấp cho các cột một tên hợp lý (ví dụ: DCOL_SomeName) để bạn có thể dễ dàng phân biệt chúng. Bao gồm tên của tiện ích DataGridView sẽ giúp ích nếu bạn có nhiều tiện ích DataGridView trên cùng một biểu mẫu.

0

tạo ra một lớp tĩnh dưới mã

public static class MyTools 
{ 
    public static int IndexByName(this DataGridView dgv, string name) 
    { 
     foreach(DataGridViewColumn col in dgv.Columns) 
     { 
      if(col.HeaderText.ToUpper().Trim() == name.ToUpper().Trim()) 
      { 
       return col.Index; 
      } 
     } 
     return -1; 
    } 
} 

và sau đó gọi nó với DataGridView bạn

int index = datagridview1.IndexByName("columnName");