【WPF】ListView の列ヘッダーの順序と幅を保存・復元

ListView の列ヘッダーの順序と幅を保存・復元するやり方です。

MEMO

WPF の ListView の話題です。Forms の ListView ではないので注意してください。

たとえばこんな xaml の場合。

<ListView>
<ListView.View>
<GridView>

    <GridViewColumn Width="50">
        <GridViewColumnHeader Content="有効" />
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding IsEnabled}" />
                </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>

    <GridViewColumn Width="250" DisplayMemberBinding="{Binding MailAddress}">
        <GridViewColumnHeader Content="メールアドレス" />
    </GridViewColumn>
    
    <GridViewColumn Width="100">
        <GridViewColumnHeader Content="メモ" />
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Memo}" />
                </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>

</GridView>
</ListView.View>
</ListView>

 

ダイアログのイメージはこんな感じ。(見やすくするために、xaml のほうからはタグをいろいろ省略してあります)

 

列順と列幅の取得(保存)のコード。

Dim oGridView As GridView = oListView.View
Dim oCols As GridViewColumnCollection = oGridView.Columns

For Each oCol As GridViewColumn In oCols
    '各列の名前と幅を好きなように保存↓
    'DirectCast(oCol.Header, GridViewColumnHeader).Content.ToString
    'oCol.Width.ToString
Next

 

列順と列幅の復元のコード。

Dim oGridView As GridView = oListView.View
Dim oCols As GridViewColumnCollection = oGridView.Columns

Dim IndexAfter As Integer = 0
For Each ColInfoArray As String() In ColNameWidthList '← 保存しておいた列名・列幅のリストや配列
    Dim ColName As String = ColInfoArray(0)
    Dim ColWidth As Integer = ColInfoArray(1)
    'このへん↑は好きなやり方で。

    Dim bFound As Boolean = False
    Dim IndexBefore As Integer = 0
    For i As Integer = IndexAfter To oCols.Count -1
        Dim oCol As GridViewColumn = oCols(i)
        if DirectCast(oCol.Header, GridViewColumnHeader).Content.ToString().Equals(ColName) Then
            bFound = True
            IndexBefore = i
            oCol.Width = ColWidth
            Exit For
        End If
    Next
    If bFound = True Then
        oCols.Move(IndexBefore, IndexAfter)
        IndexAfter += 1
    End If
Next

 

購読する
通知を受け取る対象
guest
0 Comments
Inline Feedbacks
View all comments