【问题标题】:WPF DataGrid Save Column WidthWPF DataGrid 保存列宽
【发布时间】:2021-08-04 13:32:08
【问题描述】:

我想保存和恢复DataGrid 列宽,我试过这个:

private void dataGrid_LayoutUpdated(object sender, EventArgs e)
{
    foreach (var item in dataGrid.Columns.GetEnumeratorWithIndex())
    {
        Settings.ColumnWidth[item.Index] =
            new DataGridLength(item.Value.Width.Value,
            DataGridLengthUnitType.Pixel,
            item.Value.Width.DesiredValue, item.Value.Width.DisplayValue);
    }
}

恢复:

foreach (var item in dataGrid.Columns.GetEnumeratorWithIndex())
{
    item.Value.Width = new
        DataGridLength(Settings.ColumnWidth[item.Index].Value,
        DataGridLengthUnitType.Pixel,
        Settings.ColumnWidth[item.Index].DesiredValue,
        Settings.ColumnWidth[item.Index].DisplayValue);
}

但不工作,所有列都存储为自动。

更新:

【问题讨论】:

  • 失败的原因是存储、加载还是最终的宽度修改?为什么它会失败,是忽略您还是意外修改了宽度(例如以不同的顺序)?您可能有一个阻止手动修改列宽的数据网格配置参数吗?有时不是你必须修改的列宽而是列 Header 的宽度,我现在不确定
  • @AmoRobb 所有列都保存为 Auto,但如果我使用 Debug.WriteLine(item.Value.Width.Value),我可以看到值不同且以数字表示
  • 如果来自EldHasp 的解决方案仍然不起作用,请提供有关您遇到的差异的更多信息
  • @AmoRobb 我更新了我的问题,您可以看到所有值都保存为 Auto

标签: c# wpf datagrid


【解决方案1】:

尝试使用属性ActualWidth

for (int index = 0; index < dataGrid.Columns.Count; index++)
    Settings.ColumnWidth[index] = new
        DataGridLength(dataGrid.Columns[index].ActualWidth);

阅读栏大小示例:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void GetWidthsClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(string.Join("; ",
            dataGrid.Columns.Select(column => column.Width))
            + Environment.NewLine + string.Join("; ",
            dataGrid.Columns.Select(column => column.ActualWidth)));
    }
}
public class TextsViewModel
{
    public ObservableCollection<Texts> Rows { get; } =
        new ObservableCollection<Texts>()
    {
        new Texts() {Text1="123", Text2="45678",
            Text3="90qwer", Text4="tyuiio", Text5="as"},
        new Texts() {Text1="asad", Text2="gfg",
            Text3="hkjhk", Text4="kl", Text5="fgfhgf"}
    };
}
public class Texts
{
    public string Text1 { get; set; }
    public string Text2 { get; set; }
    public string Text3 { get; set; }
    public string Text4 { get; set; }
    public string Text5 { get; set; }
}

XAML:

<Grid DataContext="{DynamicResource viewModel}">
    <FrameworkElement.Resources>
        <local:TextsViewModel x:Key="viewModel"/>
    </FrameworkElement.Resources>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <DataGrid x:Name="dataGrid" ItemsSource="{Binding Rows}"
        HorizontalAlignment="Center"/>
    <Button Content="Get Widths" Grid.Row="1"
            Click="GetWidthsClick"
            Margin="5" Padding="15 5"/>
</Grid>

【讨论】:

  • 谢谢但没用,所有值都保存为自动(我更新了我的问题,你可以看到结果)
  • 你做错了什么。我用一个更大的例子补充了答案。它读取 Width 和 ActualWidth 值。你可以看到所有Auto的Width,ActualWidth包含真实宽度。
  • 请注意,只有一个参数应该传递给 DataGridLength 构造函数。而且这个参数是ActualWidth,不是Width。
  • 您也有可能在其他地方出错。在 Settings.ColumnWidth 赋值循环之后放置一个断点并检查存储的值。
  • 在消息框中一切正常,但在设置文件中所有值都是自动,我以这种方式定义设置变量:public virtual DataGridLength[] ColumnWidth { get; set; } = new DataGridLength[5]; 是因为这个吗?
猜你喜欢
  • 2011-08-22
  • 2013-05-12
  • 2015-03-20
  • 2010-09-29
  • 2012-06-06
  • 2013-07-26
  • 2010-11-17
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多