2009-08-12 77 views
7

Tôi đang cố gắng hiển thị một DataGridView đơn giản được liên kết với một DataTable và tôi muốn, cuối cùng, cột đầu tiên của tôi trong DataTable là ô tiêu đề hàng cho DataGridView. Tại thời điểm này tôi sẽ giải quyết cho có bất kỳ giá trị trong ô tiêu đề hàng. Tôi có thể hiển thị DataGridView với tất cả các hàng và cột của tôi, và với các ô tiêu đề cột, nhưng không có ô tiêu đề hàng. Tôi kiểm tra giá trị trong row.HeaderCell.Value và dữ liệu tôi đặt ở đó. Tôi kiểm tra row.HeaderCell.Displayed và nó là sai, nhưng điều này là chỉ đọc, vì vậy tôi không thể làm cho nó đúng. Làm cách nào để hiển thị ô tiêu đề hàng?DataGridView hiển thị ô tiêu đề hàng

Dưới đây là một ví dụ đơn giản về những gì tôi đã cố gắng để có được điều này để làm việc:

 DataTable table = new DataTable(); 
     for (int i = 0; i<10; i++) 
     { 
      table.Columns.Add(new DataColumn("column-" + i)); 
     } 

     for (int i = 0; i < 10; i++) 
     { 
      DataRow theRow = table.NewRow(); 

      for (int j = 0; j < 10; j++) 
       theRow[j] = i + "-" + j; 
      table.Rows.Add(theRow); 

     } 

     dataGridView1.DataSource = table; 
     dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders; 
     int rowNumber = 1; 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      if (row.IsNewRow) continue; 
      row.HeaderCell.Value = "Row " + rowNumber; 
      rowNumber = rowNumber + 1; 
     } 
     dataGridView1.AutoResizeRowHeadersWidth(
      DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

Trả lời

1

Câu trả lời dường như xử lý sự kiện DataGridView.CellFormatting. Tại sao thiết lập giá trị ở nơi khác không hoạt động là ngoài tôi, nhưng tôi chắc chắn có một lý do. Tôi đã thêm trình xử lý sự kiện sau đây và tất cả đều tốt:

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     DataGridView gridView = sender as DataGridView; 

     if (null != gridView) 
     { 

      gridView.Rows[e.RowIndex].HeaderCell.Value = gridView.Rows[e.RowIndex].Cells[0].Value; 
      Console.WriteLine("GridViewCell: " + gridView.Rows[e.RowIndex].Cells[0].Value); 

     } 
    } 
+0

Tôi tin rằng đây là một số loại lỗi. Trong VB.NET, bạn có thể đặt 'HeaderCell.Value' khi cần thiết. Tuy nhiên, bạn phải nghỉ mát với công việc của bạn xung quanh trong C#. –

+2

Điều này là do mã được chạy từ hàm tạo. Di chuyển mã để tải sự kiện hoặc trình xử lý sự kiện khác. – AMissico

+0

Điều này được gọi cho mỗi cột, do đó, nó là một chút lãng phí. Bạn có thể muốn thay đổi nó để nó kiểm tra e.ColumnIndex == 0 trước khi nó đặt HeaderCell.Value. –

9

Nếu bạn đặt mã này vào hàm tạo, nó sẽ không hoạt động. Di chuyển mã vào sự kiện Load của biểu mẫu và nó sẽ hoạt động tốt. Một vấn đề phổ biến với Windows.Forms và C# là việc sử dụng khởi tạo không đúng trong constructor. Nhiều điều khiển không được tạo hoàn toàn cho đến sau khi hàm tạo kết thúc. (Tôi quên lý do tại sao, nhưng tôi tin rằng đó là vì tay cầm chưa được tạo ra.) Có thể tránh được nhiều "xung quanh", nếu bạn khởi tạo trong sự kiện Load theo khuyến cáo của Microsoft.

1

Sau khi gán giá trị cho các datagridview, hoặc bằng cách liên kết hoặc bằng tay, tôi đã làm như sau:

foreach (DataGridViewRow row in dgvValues.Rows) 
{ 
    row.HeaderCell.Value = (row.Index+1).ToString(); 
} 

và nó làm việc cho tôi. Tôi nghĩ rằng nên có một số giải pháp đơn giản hơn trong Linq.

4

Chỉ cần gọi ToString() như đưa ra dưới đây

row.HeaderCell.Value = ("Row " + rowNumber).ToString(); 
+0

@Andro Selva: Nếu logic này được liên kết với CTOR thì tôi không thể thấy giá trị HeaderCell khi biểu mẫu được hiển thị. Nếu tôi gọi phương thức này trong Form_Load(), nó hoạt động. :) –

1

tôi đã sử dụng câu trả lời Karl, nhưng đã thay đổi xử lý sự kiện để RowsAdded, giả sử tên tiêu đề hàng không thay đổi khi hàng được tạo ra. Vấn đề với CellFormatting là nó được gọi cho mỗi cột, do đó, nó lãng phí một số thời gian thiết lập HeaderCell.Value hơn và hơn nữa.

private void dataGridViewVersions_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
    { 
     DataGridView gridView = sender as DataGridView; 
     MyData vr = gridView.Rows[e.RowIndex].DataBoundItem as MyData ; 
     if (vr != null) 
     { 
      gridView.Rows[e.RowIndex].HeaderCell.Value = vr.RowName.ToString(); 
     } 
    } 
Các vấn đề liên quan