web-dev-qa-db-ja.com

C#ListView列幅自動

C#winforms listviewコントロールの列幅をautoに設定するにはどうすればよいですか。 width = -1/-2のようなもの?

72
Kai

あなたは答えを与えました:-2は列ヘッダーのテキストの長さに合わせて列のサイズを自動調整し、-1は列の最も長い項目に自動サイズ調整します。 MSDNによるとすべて 。ただし、-1の場合、アイテムを追加した後に列幅を設定する必要があることに注意してください。したがって、新しいアイテムを追加する場合は、ListViewコントロールのデータに従って自動サイズ調整する列の幅プロパティも割り当てる必要があります。

99
Fredrik Mörk

これを使って:

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

from ここ

87
Majid

リストビューを複数回クリアして補充するプログラムを作成しました。何らかの理由で、width = -2の列を追加するたびに、最初の列が長すぎるという問題が発生しました。これを修正するために私がしたことは、このメソッドを作成することでした。

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

この方法の素晴らしい点は、これをどこにでも置いてすべての列のサイズを変更できることです。 ListViewを渡すだけです。

22
Jimmy Campbell

このソリューションは、最初に列データに基づいて列のサイズを変更します。サイズ変更された幅がヘッダーサイズより小さい場合、少なくともヘッダーに合うように列のサイズを変更します。これは非常にいソリューションですが、動作します。

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;
        }
    }
1
Tomáš Krása

たとえば、列の自動サイズ変更幅をオンザフライで設定する場合、Fredrikの答えを少し拡大します。最初の列の自動サイズ変更幅を70に設定します。

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

AutoResizeColumnと呼ばれる別の便利なメソッドがあり、必要なパラメーターを使用して特定の列のサイズを自動調整できます。

このような:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
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);
}
0
tonyb

このようなものを使用して、必要な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
Nickyboy