C#ListView列幅自動


82

ac#winformslistviewコントロールの列幅を自動に設定するにはどうすればよいですか。幅= -1 / -2のようなもの?

回答:


107

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


MSDNの記事ではColumnHeaderについて言及していますが、これは単に列を意味するだけであることに注意してください。コード例:myListView.Columns[0].Width = -1;
エリック・G

103

これを使って:

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

ここから


8
しかし、ヘッダーまたはデータ幅の最大値が必要な場合はどうでしょうか。ちらつきなし?
toddmo 2014

@toddmo両方の文字列を使用します。また、必要に応じて、listView.BeginUpdate();の間。... listView.EndUpdate();
アルテムZh。

23

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

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

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


1
これにより、幅がListViewの最後のアイテムの幅に設定されます
Qsiris 2012

私はあなたのコードを使用しますが、リストビューに列が1つしかない場合は、水平スクロールバーが表示されるたびに表示されます。少なくとも2つの列がある場合、コードは適切に機能します。この振る舞いはどこから来ているのか知っていますか?
プロトタイプ

2

親パネル(ListViewドックフィル)にListViewがある場合は、単純な方法を使用できます...

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

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はタイトルに合わせるために必要な幅です。等。


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フォームデザイナでのイベントハンドラの作成

私自身VBのバックグラウンドから来て、これは私が探していたものです、これはクリックの逆の簡単なバージョンです:

  1. イベントハンドラーを作成するフォームまたはコントロールをクリックします。
  2. [プロパティ]ウィンドウで、[イベント]ボタンをクリックします
  3. 使用可能なイベントのリストで、イベントハンドラーを作成するイベントをクリックします。
  4. イベント名の右側のボックスにハンドラーの名前を入力し、Enterキーを押します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.