2013-09-06 161 views
55

Tôi có 3 cột trong số DataGridView. Những gì tôi đang cố gắng làm là có 2 cột đầu tiên tự động vừa với chiều rộng của nội dung và có cột thứ 3 lấp đầy khoảng trống còn lại.DataGridView AutoFit và điền

Có thể thực hiện trong WinForms không? Tôi đang tải dữ liệu của tôi từ một EF DataContext nếu đó là bất kỳ sử dụng nào. Tôi đã bao gồm một hình ảnh của nó trông như thế nào.

enter image description here

Trả lời

104

Bạn cần phải sử dụng DataGridViewColumn.AutoSizeMode tài sản.

Bạn có thể sử dụng một trong các giá trị cho cột 0 và 1:

AllCells:Chiều rộng cột điều chỉnh để phù hợp với nội dung của tất cả các tế bào trong cột, trong đó có các tế bào tiêu đề.
AllCellsExceptHeader:Độ rộng cột điều chỉnh để vừa với nội dung của tất cả các ô trong cột, ngoại trừ ô tiêu đề.
DisplayedCells:Chiều rộng cột điều chỉnh để phù hợp với nội dung của tất cả các ô trong cột có trong hàng hiện hiển thị trên màn hình, bao gồm các ô tiêu đề.
DisplayedCellsExceptHeader:Chiều rộng cột điều chỉnh để phù hợp với nội dung của tất cả các ô trong cột có trong hàng hiện hiển thị trên màn hình, trừ các ô tiêu đề.

Sau đó, bạn sử dụng Fill giá trị cho cột 2

Chiều rộng cột điều chỉnh sao cho độ rộng của tất cả các cột chính xác lấp đầy vùng hiển thị của điều khiển ...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; 
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; 
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 

Như được chỉ ra bởi những người dùng khác, giá trị mặc định có thể được đặt ở mức datagridview với thuộc tính DataGridView.AutoSizeColumnsMode.

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; 
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; 

có thể là:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

Lưu ý quan trọng:

Nếu lưới của bạn được ràng buộc với một nguồn dữ liệu và các cột được tự động tạo ra (AutoGenerateColumns bất động sản thiết lập để True) , bạn cần sử dụng sự kiện DataBindingComplete để áp dụng kiểu SAU cột đã được tạo ra.


Trong một số trường hợp (thay đổi ô giá trị theo mã ví dụ), tôi phải gọi DataGridView1.AutoResizeColumns(); để làm mới lưới.

+1

Hoạt động hoàn hảo khi sử dụng sự kiện DataBindingComplete. –

+0

Tôi không thể tìm cách gọi phương thức DataBindingComplete sau khi datagrid được điền – Dan

+0

@Dan DataBindingComplete không phải là phương thức *, đó là sự kiện * datagridview * mà bạn cần đăng ký. Câu trả lời này http://stackoverflow.com/a/31685874/2387010 đưa ra một ví dụ. Nó có giúp ích không? – Chris

4

Không thử nghiệm nhưng bạn có thể cung cấp cho một thử. Đã kiểm tra và làm việc. Tôi hy vọng bạn có thể chơi với AutoSizeMode của DataGridViewColum để đạt được những gì bạn cần.

Hãy thử thiết

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode 

//Set the following properties after setting datasource 
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 

này nên làm việc

+0

này không hoạt động. Tôi đang thiết lập nó khi biểu mẫu khởi tạo trước khi nguồn dữ liệu được thêm từ DataContext. Đó có thể là lý do tại sao? Tôi không chắc chắn nơi để đặt nó như là dữ liệu được nạp vào thời gian chạy và các cột được lấy từ mô hình EF. –

+0

Có vẻ như vậy nhưng không, dòng thứ ba không hoạt động, tôi đã thử nghiệm cách đây 10 phút. –

+0

@ JamesJeffery bạn đang AutoPopulating cột hoặc tự điền? –

-1
public void setHeight(DataGridView src) 
{ 
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 + src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height); 
} 
+0

chỉ cần gọi chức năng đó, nó sẽ chăm sóc của quyết định chiều cao datagridview dựa trên số hàng trong nó –

+1

Trước hết, mà không trả lời câu hỏi của OP. Ngoài ra (để tham khảo trong tương lai) bao gồm nhận xét như vậy về câu trả lời chính nó (bạn có thể chỉnh sửa nó). – Joel

0

Hãy thử làm,

AutoSizeColumnMode = Fill; 
+0

Điều đó có vẻ như những gì OP đã làm – Dan

0
public static void Fill(DataGridView dgv2) 
    { 
     try 
     { 
      dgv = dgv2; 
      foreach (DataGridViewColumn GridCol in dgv.Columns) 
      { 
       for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++) 
       { 
        GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
        GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
        GridCol.DataGridView.Columns[j].FillWeight = 1; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
+1

Mã này không phải là tuyệt vời. Trước tiên, bạn không cần vòng lặp lồng nhau, trong đó thiết lập chế độ chiều rộng của tất cả các cột cho cùng một điều nhiều () lần; bạn có thể truy cập các thuộc tính AutoSizeMode và FillWeight của mỗi cột trực tiếp từ 'GridCol'. Thứ hai là thiết lập AutoSizeMode cho mỗi cột thành hai giá trị khác nhau; nhiệm vụ thứ hai sẽ ghi đè lên lần đầu tiên. – JonP

3

Chỉ cần thay đổi tài sản từ tài sản của kiểm soát: AutoSizeColumnsMode:Fill

hoặc theo mã

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

+1

Cảm ơn bạn. Tôi đã tìm kiếm một giải pháp như thế này! :) –

+0

Có vẻ như OP đã làm điều này – Dan

17

Đây là cách tiếp cận yêu thích của tôi ...

_dataGrid.DataBindingComplete += (o, _) => 
    { 
     var dataGridView = o as DataGridView; 
     if (dataGridView != null) 
     { 
      dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 
      dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
     } 
    }; 
-1

Hãy thử điều này:

DGV.AutoResizeColumns(); 
    DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;