C # ListView Column Width Auto


82

Làm cách nào để đặt chiều rộng cột của listviewđiều khiển ac # winforms thành tự động. Một cái gì đó như chiều rộng = -1 / -2?

Câu trả lời:


106

Bạn đã đưa ra câu trả lời: -2 sẽ tự động điều chỉnh cột theo độ dài của văn bản trong tiêu đề cột, -1 sẽ tự động điều chỉnh kích thước cho mục dài nhất trong cột. Tất cả theo MSDN . Lưu ý rằng trong trường hợp -1, bạn sẽ cần đặt chiều rộng cột sau khi thêm (các) mục. Vì vậy, nếu bạn thêm một mục mới, bạn cũng sẽ cần phải gán thuộc tính chiều rộng của cột (hoặc các cột) mà bạn muốn tự động kích thước theo dữ liệu trong ListViewkiểm soát.


Lưu ý rằng trong khi bài viết MSDN tham chiếu đến ColumnHeader, điều đó chỉ có nghĩa là cột. Ví dụ về mã:myListView.Columns[0].Width = -1;
Eric G

103

Dùng cái này:

yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

từ đây


8
Nhưng nếu bạn muốn tối đa tiêu đề hoặc chiều rộng dữ liệu thì sao? Không có nhấp nháy?
toddmo

@toddmo Sử dụng cả hai chuỗi. Và, nếu cần thiết, giữa listView.BeginUpdate (); ... listView.EndUpdate ();
Artem Zh.

23

Tôi đã thực hiện một chương trình xóa và điền lại lần xem danh sách của mình nhiều lần. Vì một số lý do bất cứ khi nào tôi thêm các cột có chiều rộng = -2, tôi gặp sự cố với cột đầu tiên quá dài. Những gì tôi đã làm để khắc phục điều này là tạo ra phương pháp này.

private void ResizeListViewColumns(ListView lv)
{
    foreach(ColumnHeader column in lv.Columns)
    {
        column.Width = -2;
    }
}

Điều tuyệt vời về phương pháp này là bạn có thể đặt nó ở bất cứ đâu để thay đổi kích thước tất cả các cột của bạn. Chỉ cần vượt qua của bạn ListView.


1
điều này sẽ thiết lập chiều rộng với chiều rộng của mục cuối cùng trong ListView của bạn
Qsiris

Tôi sử dụng mã của bạn nhưng nếu tôi chỉ có một cột trong chế độ xem danh sách của mình, mỗi lần tôi nhận được một thanh cuộn ngang. Nếu có ít nhất hai cột, mã hoạt động tốt. Bạn có biết hành vi này đến từ đâu không?
nguyên

2

Có một phương pháp hữu ích khác được gọi là AutoResizeColumncho phép bạn tự động kích thước một cột cụ thể với tham số bắt buộc.

Bạn có thể gọi nó như thế này:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);

1

Mở rộng một chút về câu trả lời của Fredrik, nếu bạn muốn đặt nhanh chiều rộng tự động thay đổi kích thước của cột, ví dụ: đặt chiều rộng kích thước tự động của cột đầu tiên thành 70:

myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

1

Giải pháp này trước tiên sẽ thay đổi kích thước các cột dựa trên dữ liệu cột, nếu chiều rộng được thay đổi kích thước nhỏ hơn kích thước tiêu đề, nó sẽ thay đổi kích thước các cột để ít nhất vừa với tiêu đề. Đây là một giải pháp khá xấu, nhưng nó hoạt động.

lstContacts.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
colFirstName.Width = (colFirstName.Width < 60 ? 60 : colFirstName.Width);
colLastName.Width = (colLastName.Width < 61 ? 61 : colLastName.Width);
colPhoneNumber.Width = (colPhoneNumber.Width < 81 ? 81 : colPhoneNumber.Width);
colEmail.Width = (colEmail.Width < 40 ? 40 : colEmail.Width);

lstContacts là ListView. colFirstName là một cột, trong đó 60 là chiều rộng bắt buộc để vừa với tiêu đề. Vân vân.


1

Nếu bạn có ListView trong bất kỳ bảng Parent nào (lấp đầy dock ListView), bạn có thể sử dụng phương pháp đơn giản ...

private void ListViewHeaderWidth() {
        int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
        foreach (ColumnHeader header in listViewInfo.Columns)
        {
            header.Width = HeaderWidth;
        }
    }

0

Bạn có thể sử dụng một cái gì đó như thế này, chuyển ListView bạn muốn vào param

    private void AutoSizeColumnList(ListView listView)
    {
        //Prevents flickering
        listView.BeginUpdate();

        Dictionary<int, int> columnSize = new Dictionary<int,int>();

        //Auto size using header
        listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

        //Grab column size based on header
        foreach(ColumnHeader colHeader in listView.Columns )
            columnSize.Add(colHeader.Index, colHeader.Width);

        //Auto size using data
        listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);

        //Grab comumn size based on data and set max width
        foreach (ColumnHeader colHeader in listView.Columns)
        {
            int nColWidth;
            if (columnSize.TryGetValue(colHeader.Index, out nColWidth))
                colHeader.Width = Math.Max(nColWidth, colHeader.Width);
            else
                //Default to 50
                colHeader.Width = Math.Max(50, colHeader.Width);
        }

        listView.EndUpdate();
    }

0

Cũng cần lưu ý rằng ListView có thể không hiển thị như mong đợi nếu không thay đổi thuộc tính trước:

myListView.View = View.Details; // or View.List

Đối với tôi Visual Studio dường như mặc định nó thành View.LargeIcon vì một số lý do nên không có gì xuất hiện cho đến khi nó được thay đổi.

Hoàn thành mã để hiển thị một cột duy nhất trong ListView và cho phép không gian cho thanh cuộn dọc.

lisSerials.Items.Clear();
lisSerials.View = View.Details;
lisSerials.FullRowSelect = true;

// add column if not already present
if(lisSerials.Columns.Count==0)
{
    int vw = SystemInformation.VerticalScrollBarWidth;
    lisSerials.Columns.Add("Serial Numbers", lisSerials.Width-vw-5);
}

foreach (string s in stringArray)
{
    ListViewItem lvi = new ListViewItem(new string[] { s });
    lisSerials.Items.Add(lvi);
}

-1

Tôi tin rằng tác giả đang tìm kiếm một phương pháp tương đương thông qua IDE sẽ tạo mã phía sau và đảm bảo tất cả các tham số đều ở đúng vị trí, v.v. Tìm thấy điều này từ MS:

Tạo trình xử lý sự kiện trên Windows Forms Designer

Bản thân xuất thân từ nền tảng VB, đây là những gì tôi đang tìm kiếm, đây là phiên bản ngắn gọn cho nhấp chuột bất lợi:

  1. Bấm vào biểu mẫu hoặc điều khiển mà bạn muốn tạo trình xử lý sự kiện.
  2. Trong cửa sổ Thuộc tính, nhấp vào nút Sự kiện
  3. Trong danh sách các sự kiện có sẵn, hãy bấm vào sự kiện mà bạn muốn tạo trình xử lý sự kiện.
  4. Trong hộp ở bên phải của tên sự kiện, hãy nhập tên của trình xử lý và nhấn ENTER
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.