C # ListView 열 너비 자동


82

ac # winforms listview컨트롤 의 열 너비를 어떻게 자동으로 설정할 수 있습니까 ? width = -1 / -2?

답변:


106

답 : -2는 열 머리글의 텍스트 길이로 열 크기를 자동 조정하고 -1은 열에서 가장 긴 항목의 크기를 자동으로 조정합니다. 모두 MSDN에 따라 . -1의 경우 항목을 추가 한 후 열 너비를 설정해야합니다. 따라서 새 항목을 추가하는 경우 ListView제어중인 데이터에 따라 자동 크기 조정하려는 열 (또는 열)의 너비 속성도 할당해야합니다 .


MSDN 기사에서 ColumnHeader를 참조하지만 이는 열을 의미합니다. 코드 예 :myListView.Columns[0].Width = -1;
Eric G

103

이것을 사용하십시오 :

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

에서 여기


8
그러나 헤더의 최대 값이나 데이터 너비를 원한다면 어떻게 될까요? 깜박임없이?
toddmo 2014 년

@toddmo 두 문자열을 모두 사용합니다. 그리고 필요한 경우 listView.BeginUpdate (); ... listView.EndUpdate ();
Artem Zh.

23

목록보기를 여러 번 지우고 다시 채우는 프로그램을 만들었습니다. 어떤 이유로 너비 = -2 열을 추가 할 때마다 첫 번째 열이 너무 길다는 문제가 발생했습니다. 이 문제를 해결하기 위해 내가 한 일은이 방법을 만드는 것입니다.

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

이 방법의 가장 좋은 점은 모든 열의 크기를 조정하기 위해 어느 곳에 나 배치 할 수 있다는 것입니다. 그냥 전달 ListView.


1
그러면 너비가 ListView의 마지막 항목 너비로 설정됩니다
Qsiris

귀하의 코드를 사용하지만 목록보기에 열이 하나만 있으면 가로 스크롤 막대가 나타날 때마다. 열이 두 개 이상 있으면 코드가 잘 작동합니다. 이 동작이 어디에서 오는지 알고 있습니까?
prototype0815

2

AutoResizeColumn필요한 매개 변수를 사용하여 특정 열의 크기를 자동으로 조정할 수있는 또 다른 유용한 방법 이 있습니다.

다음과 같이 부를 수 있습니다.

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

1

예를 들어 열의 자동 크기 조정 너비를 즉석에서 설정하려는 경우 Fredrik의 답변에 대해 조금 확장 : 첫 번째 열의 자동 크기 너비를 70으로 설정 :

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

1

이 솔루션은 먼저 열 데이터를 기반으로 열 크기를 조정합니다. 크기가 조정 된 너비가 머리글 크기보다 작 으면 최소한 머리글에 맞도록 열 크기를 조정합니다. 이것은 매우 추악한 솔루션이지만 작동합니다.

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는 ListView입니다. colFirstName은 열이며 여기서 60은 제목을 맞추는 데 필요한 너비입니다. 기타.


1

부모 패널 (ListView 도크 채우기)에 ListView가있는 경우 간단한 방법을 사용할 수 있습니다.

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

0

이와 같은 것을 사용하여 원하는 ListView를 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

먼저 속성을 변경하지 않으면 ListView가 예상대로 표시되지 않을 수 있습니다.

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

나에게 Visual Studio는 어떤 이유로 든 View.LargeIcon으로 기본 설정되어 변경 될 때까지 아무것도 나타나지 않습니다.

ListView에 단일 열을 표시하고 세로 스크롤 막대를위한 공간을 허용하는 완전한 코드입니다.

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

저자는 IDE를 통해 코드를 생성하고 모든 매개 변수가 제자리에 있는지 확인하는 동등한 방법을 찾고 있다고 생각합니다. MS에서 다음을 발견했습니다.

Windows Forms 디자이너에서 이벤트 처리기 만들기

VB 배경에서 내가 찾던 것이 바로 여기에 클릭 불리한에 대한 간략한 버전이 있습니다.

  1. 이벤트 처리기를 만들려는 폼이나 컨트롤을 클릭합니다.
  2. 속성 창에서 이벤트 버튼을 클릭합니다.
  3. 사용 가능한 이벤트 목록에서 이벤트 처리기를 만들 이벤트를 클릭합니다.
  4. 이벤트 이름 오른쪽에있는 상자에 처리기 이름을 입력하고 Enter 키를 누릅니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.