代码之家  ›  专栏  ›  技术社区  ›  kenwarner

WPF DataGrid列宽和重新排序

  •  3
  • kenwarner  · 技术社区  · 15 年前

    我有一个数据网格定义为

    <wpftoolkit:DataGrid
            x:Name="AccountsDataGrid"
            AutoGenerateColumns="False"
            ItemsSource="{Binding Path=Accounts}"
            ColumnReordered="DataGrid_ColumnReordered"
            SelectionUnit="FullRow"
            RowHeaderWidth="0"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            >
            <wpftoolkit:DataGrid.Columns>
                <wpftoolkit:DataGridTextColumn Header="Account Id" Binding="{Binding Path=AccountId}" Width="Auto" />
                <wpftoolkit:DataGridTextColumn Header="Account Name" Binding="{Binding Path=AccountName}" Width="*" />
            </wpftoolkit:DataGrid.Columns>
        </wpftoolkit:DataGrid>
    

    装在车上看起来很棒。第一列适合内容和标题所需的最小宽度。第二列将拉伸以填充数据网格的其余宽度(因此我没有第三个填充列)。但是,如果我尝试重新排序列,则AccountName列的大小不能调整为小于重新排序前的宽度。所以我在ColumnReordered事件上添加了一个处理程序,以为我可以重置列宽,但似乎不起作用。事实上,它将AccountId列缩小到几乎为零,AccountName列的大小仍然不能变小。

    private void DataGrid_ColumnReordered(object sender, Microsoft.Windows.Controls.DataGridColumnEventArgs e)
        {
            foreach (DataGridColumn column in AccountsDataGrid.Columns)
            {
                if (column.Equals(AccountsDataGrid.Columns.Last()))
                {
                    column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Star);
                }
                else
                {
                    column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
                }
            }
        }
    

    是否有更好的方法来处理列宽,以及为什么列重新排序会破坏列调整大小的能力

    1 回复  |  直到 15 年前
        1
  •  3
  •   Eric    13 年前

    列不会更改列集合中的位置。只有显示索引正在更改。试试这个:

      private void DataGrid_ColumnReordered(object sender, DataGridColumnEventArgs e)
        {
            int lastColumnOrder = AccountsDataGrid.Columns.Count() - 1;
            foreach (DataGridColumn column in AccountsDataGrid.Columns)
            {
                if (column.DisplayIndex == lastColumnOrder)
                {
                    column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Star);
                }
                else
                {
                    column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
                }
            } 
        }