Как добавить сортировку, нажав на заголовок столбца в этом GridView? - PullRequest
0 голосов
/ 29 апреля 2011
ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {
        New-ListView -Name ListView -View {
           New-GridView -AllowsColumnReorder -Columns {
               New-GridViewColumn "title" 
           }
    } -show -On_Loaded {
            $ff_sql = @"
SELECT 'abc' title
union
SELECT 'xyz' title
union
SELECT 'efg' title
"@
            $TableView = $window | Get-ChildControl ListView
            $TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)
             } 
}

Show-Bockmarks $conn

Edit: Я преобразовал код в XAML

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {

[xml] $xaml = @"
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="MainWindow" >
<ListView ItemsSource="{Binding Persons}"
      IsSynchronizedWithCurrentItem="True"
      Name="Listview">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="title"
                                DisplayMemberBinding="{Binding title}" 
                                />
                <GridViewColumn Header="itemid"
                                DisplayMemberBinding="{Binding itemid}" 
                                />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )

$ff_sql = @"
SELECT 'abc' title, 3 itemid
union
SELECT 'xyz' title, 2 itemid
union
SELECT 'efg' title, 1 itemid
"@

$TableView = $Form.FindName("Listview")
$TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)

$Form.ShowDialog() #| out-null
}

Show-Bockmarks $conn

Но когда я добавил строки, предложенные Томасом Левеском

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {

[xml] $xaml = @"
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:util="clr-namespace:TheNameSpace;assembly=TheAssembly"
  Title="MainWindow" >
<ListView ItemsSource="{Binding Persons}"
      IsSynchronizedWithCurrentItem="True"
       util:GridViewSort.AutoSort="True"
      Name="Listview">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="title"
                                DisplayMemberBinding="{Binding title}"
                                util:GridViewSort.PropertyName="title" 
                                />
                <GridViewColumn Header="itemid"
                                DisplayMemberBinding="{Binding itemid}" 
                                util:GridViewSort.PropertyName="itemid" 
                                />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )

$ff_sql = @"
SELECT 'abc' title, 3 itemid
union
SELECT 'xyz' title, 2 itemid
union
SELECT 'efg' title, 1 itemid
"@

$TableView = $Form.FindName("Listview")
$TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)

$Form.ShowDialog() #| out-null
}

Show-Bockmarks $conn

Я получаю ошибку

Exception calling "Load" with "1" argument(s): "The property 'GridViewSort.AutoSort' does not exist in XML namespace 'clr-namespace:TheNameSpace;assembly=TheAssembly'. Line '0' 
Position '0'."

Полагаю, мне нужно зарегистрировать какую-то сборку.

1 Ответ

2 голосов
/ 29 апреля 2011

См. это сообщение в блоге это ) для решения XAML

Вы также можете использовать это решение в коде, используя методы GridViewSort.SetAutoSort и GridViewSort.SetPropertyName. Я не знаю синтаксис Powershell, но здесь он находится в C #:

GridViewSort.SetAutoSort(TableView, true);
GridViewSort.SetPropertyName(TitleColumn, "title");
...