DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ListViewの一覧表示での列幅の制御

分類:[.NET]

こんにちは。

ListViewでViewをDetailsにして一覧表示にして使っています。

列幅についてなのですがWidth=-1や-2に設定するという方法はわかったのですが
いまひとつ思うような動作をさせることができません。

4列あったとして
|0|1|2|3|
このような形で一覧表示されているところで

ListViewのサイズを広げると

|0   |1|2|3|
と、1,2,3の列は固定幅(文字列の長さから固定幅が計算されるとうれしい)
で、0の列だけが、幅が伸縮するという
形で動作させたいのですが

どのようなコードを書けばよろしいでしょうか?

教えてください。よろしくおねがいします。

簡単にプロパティ設定でできるものではないでしょうか?
簡単にプロパティ設定でできる方法は、私は知りません。

もし2列目以降の列の幅が固定されているならば、ListViewのクライアント領域の幅から2列目以降の列の幅を引いたものを1列目の幅にすればよいのではないでしょうか。

2列目以降を文字列の幅とするならば、とりあえずこれらの列はAutoResizeColumnメソッドなどで自動調節して、その後1列目の幅を計算するという方法でいかがでしょうか。(HeaderSizeで自動調節したときは最後の列が文字列の幅にならないかもしれませんが、その場合はとりあえず最後にダミーの列を入れておき、自動調節した後、ダミーの列を削除するという方法で対処できるかもしれません。)
> 簡単にプロパティ設定でできる方法は、私は知りません。
> もし2列目以降の列の幅が固定されているならば、ListViewのクライアント領域の幅から2列目以降の列の幅を引いたものを1列目の幅にすればよいのではないでしょうか。

> 2列目以降を文字列の幅とするならば、とりあえずこれらの列はAutoResizeColumnメソッドなどで自動調節して、その後1列目の幅を計算するという方法でいかがでしょうか。


ありがとうございます。

ヒントいただき、
次のコードでうまく動きました。

    Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize

        ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)

        Dim WidthSum As Integer = _
            ListView1.Columns(1).Width + _
            ListView1.Columns(2).Width + _
            ListView1.Columns(3).Width + _
            ListView1.Columns(4).Width + _
            ListView1.Columns(5).Width

        ListView1.Columns(0).Width = _
            ListView1.ClientSize.Width - WidthSum

    End Sub
解決済み!
更に改造して完璧な動作を目指してみました。

    Public Sub SetListViewSpringColumnWidth(ByRef TargetListView As ListView, _
                                            ByRef ResizePriority As Stack)

        Dim SumWidth As Integer = 0
        Dim PopIndex As Integer = 0
        If TargetListView.Columns.Count = 0 Then Exit Sub
        If ResizePriority.Count <> ListView1.Columns.Count Then Exit Sub

        TargetListView.Columns.Add("") 'ダミー列追加
        TargetListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)


        While True
            PopIndex = ResizePriority.Pop
            SumWidth += TargetListView.Columns(PopIndex).Width
            If (Not (TargetListView.ClientSize.Width > SumWidth)) _
            Or (ResizePriority.Count = 0) Then
                SumWidth -= TargetListView.Columns(PopIndex).Width
                TargetListView.Columns(PopIndex).Width = _
                    TargetListView.ClientSize.Width - SumWidth
                Exit While
            End If

        End While

        While 1 <= ResizePriority.Count
            TargetListView.Columns(ResizePriority.Pop).Width = 0
        End While

        TargetListView.Columns.RemoveAt(ListView1.Columns.Count - 1)
    End Sub

    Private Sub MainForm_ResizeEnd(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ResizeEnd
        Dim ResizePriority As New Stack
        ResizePriority.Push(0)
        ResizePriority.Push(1)
        ResizePriority.Push(2)
        ResizePriority.Push(3)
        ResizePriority.Push(4)
        ResizePriority.Push(5)

        SetListViewSpringColumnWidth(ListView1, ResizePriority)
    End Sub

リサイズ優先度は呼び出し側のStackで指定しています。

上記ソースの
ResizePriorityを
        ResizePriority.Push(1)
        ResizePriority.Push(0)
        ResizePriority.Push(2)
の順番に変更すると、
一番最初に、列1が伸びたり縮んだりします。
列1の幅が0になると、次に列0が伸縮し
列0の幅が0になると、次に列2が伸縮します。


ListViewの幅が広くても狭くても、横スクロールバーは出ません。
また、任意列数のListViewに対応しています。

必要な方は、お試しください。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板