DataGridView AutoFit and Fill


82

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

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

nhập mô tả hình ảnh ở đây

Câu trả lời:


165

Bạn cần sử dụng DataGridViewColumn.AutoSizeModetài sản.

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

AllCells: Chiều 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, bao gồm cả ô tiêu đề.
AllCellsExceptHeader: Chiều 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 nằm trong các hàng hiện được hiển thị trên màn hình, bao gồm cả ô tiêu đề.
DisplayedCellsExceptHeader: Chiều 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 nằm trong các hàng hiện được hiển thị trên màn hình, ngoại trừ ô tiêu đề.

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

Chiều rộng cột điều chỉnh để chiều rộng của tất cả các cột lấp đầy chính xác 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ư những người dùng khác đã chỉ ra, giá trị mặc định có thể được đặt ở datagridviewmức với thuộc DataGridView.AutoSizeColumnsModetính.

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 liên kết với nguồn dữ liệu và các cột được tạo tự động (thuộc AutoGenerateColumnstính được đặt thành True), bạn cần sử dụng DataBindingCompletesự kiện để áp dụng kiểu SAU KHI các cột được tạo.


Trong một số trường hợp (thay đổi giá trị ô bằng mã chẳng hạn), 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.
James Jeffery

Tôi không thể hình dung làm thế nào để gọi phương thức DataBindingComplete sau DataGrid là dân cư
Dan

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

Sẽ rất hữu ích nếu ví dụ được giải thích, nhưng sẽ đủ. Các bài viết MSDN mà bạn liên kết đến trong bài viết của bạn hiển thị nó như là một phương pháp, đó là những gì tôi sử dụng như mô hình của tôi, nhưng không thể tìm ra cách nó được gọi.
Dan

1
@Chris rằng phần thông tin còn thiếu chắc chắn hữu ích, cảm ơn. Tôi đang đọc cuốn sách nàymới chuyển sang chương về các đại biểu và hàm lambda, vì vậy hy vọng điều này sẽ có ý nghĩa hơn trong thời gian ngắn. Cảm ơn bạn!
Dan

22

Đâ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;
        }
    };

Nếu kích thước cột = 0, index out of bound exceptionchỉ cần sửa lỗi đó, cảm ơn !!
TiyebM

14

Chỉ cần thay đổi Thuộc tính từ thuộc tính 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! :)
Alin Ciocan

4

Không được thử nghiệm nhưng bạn có thể thử. Đã thử nghiệm và hoạt động. Tôi hy vọng bạn có thể chơi với AutoSizeModecácDataGridViewColum để đạt được những gì bạn cần.

Thử cài đặ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;

Điều này sẽ hoạt động


Điều này không hoạt động. Tôi đang đặt 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ó vì dữ liệu được tải tại thời điểm chạy và các cột được lấy từ mô hình EF.
James Jeffery

Hình như vậy nhưng không phải, dòng thứ 3 không hoạt động, tôi đã test cái này 10 phút trước.
King King

@JamesJeffery bạn đang Tự động điền các cột hay điền theo cách thủ công?
Sriram Sakthivel

@SriramSakthivel Tôi đang sử dụng thuộc tính dataGridView1.DataSource để liên kết một Danh sách được trả về từ DataContext của tôi.
James Jeffery

0

Hãy thử làm,

 AutoSizeColumnMode = Fill;

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. Đầu tiên, bạn không cần vòng lặp lồng nhau, đặt chế độ chiều rộng của tất cả các cột thành cùng một thứ nhiều (<số cột>) lần; bạn có thể truy cập trực tiếp vào thuộc tính AutoSizeMode và FillWeight của mỗi cột GridCol. Thứ hai, nó là đặt AutoSizeMode cho mỗi cột thành hai giá trị khác nhau; bài tập thứ hai sẽ ghi đè bài tập đầu tiên.
JonP

0

Để xây dựng dựa trên câu trả lời của AlfredBr, nếu bạn đã ẩn một số cột của mình, bạn có thể sử dụng cách sau để tự động điều chỉnh kích thước tất cả các cột và sau đó chỉ cần để cột hiển thị cuối cùng lấp đầy khoảng trống:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

0

Đây là những gì tôi đã làm để làm cho cột "first_name" lấp đầy khoảng trống khi tất cả các cột không thể làm điều đó.

Khi lưới chuyển đến cột nhỏ "first_name" gần như vô hình (rất mỏng), vì vậy tôi có thể đặt DataGridViewAutoSizeColumnMode thành AllCells như các cột khác có thể nhìn thấy. Đối với các vấn đề về hiệu suất, điều quan trọng là phải đặt chúng thành Không trước khi liên kết dữ liệu và đặt trở lại AllCell trong trình xử lý sự kiện DataBindingComplete của lưới. Hy vọng nó giúp!

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }

-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);
}

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

1
Trước hết, điều đó 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ề chính câu trả lời (bạn có thể chỉnh sửa nó).
Joel

-2

Thử đi :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.