【问题标题】:datagrid default sort and get valuedatagrid 默认排序并获取值
【发布时间】:2017-11-17 16:56:44
【问题描述】:

在我的 WPF 项目中,我有一个如下所示的数据网格:

 <DataGrid x:Name="dgConfig" BorderThickness="5" AutoGenerateColumns="False" Margin="10,10,10,15" ItemsSource="{Binding ModulesView, Mode=TwoWay}" FontSize="14" Background="White">
     <DataGrid.Columns>
         <DataGridTextColumn Header="ParamName" Binding="{Binding ParamName}" />
         <DataGridTextColumn Header="ParamValue" Binding="{Binding ParamValue}" />
         <DataGridTextColumn Header="DefaultValue" Binding="{Binding DefaultValue}" />
         <DataGridTextColumn Header="MaxValue" Binding="{Binding MaxValue}"/>
         <DataGridTextColumn Header="MinValue" Binding="{Binding MinValue}"/>
         <DataGridTextColumn Header="Address" Binding="{Binding Address}" SortDirection="Ascending"/>
     </DataGrid.Columns>
 </DataGrid>

现在我想获得ParamValueRow 值。在这种情况下,我需要将ParamValueAddress的顺序放入registerArray,那么我应该如何设置DatagridAddress的顺序显示,然后将ParamValue放入数组 registerArrayAddress 的顺序排列?非常感谢!

--------------------------------更新-------------- ----------------------------------------

定义模块视图:

    public ICollectionView ModulesView
    {
        get { return _ModulesView; }
        set
        {
            _ModulesView = value;
            NotifyPropertyChanged();
        }
    }

使用模块视图:

    private void RefreshModule()
    {
        ModulesView = new ListCollectionView(sdb.GetModules())
        {
            Filter = obj =>
            {
                var Module = (Module)obj;
                return SelectedProduct != null && SelectedProduct.ModelNumber == Module.ModelNumber;
            }
        };
    }

【问题讨论】:

  • 2 个问题,首先,您是如何通过代码隐藏或使用 ItemsSource“ModulesView”填充数据网格的?其次,您的排序应该已经正确设置,因为您在地址列上使用了SortDirection="Ascending"
  • 首先我在 ViewModel 中使用ICollectionView ModulesView 来填充数据网格,其次我不知道为什么但是 Row 中的数据@ 987654336@ 没有默认排序,直到我单击行标题。
  • 对于排序问题,在设置 ItemsSource 之前通过OrderBy() 对项目进行排序是否可以接受?这样您就不必依赖 Datagrid 排序。 DataGrid SortDirection ignored。你还有一个小错字Header="Addrsss"应该是Header="Address"
  • 至于您的ParamValue 问题,是否有类似用户可以点击的按钮,并且应该触发registerArray 被填充?如果是这样,您可以在代码的任何位置使用registerArray = ModulesView.OrderBy(mod =&gt; mod.Address).Select(mod =&gt; mod.ParamValue).ToArray(); 来获取数组。请注意,您需要using System.Linq;
  • @KeyurPATEL 抱歉,我的 ModulesView 似乎无法调用 OrderBy 方法。

标签: c# wpf sorting datagrid


【解决方案1】:

看到您的 ModulesView 代码后,我建议在这一步使用 ObservableCollection 绑定 ModulesView = new ListCollectionView(sdb.GetModules()) 而不是 sdb.GetModules()

public ICollectionView ModulesView
{
    get { return _ModulesView; }
    set
    {
        _ModulesView = value;
        NotifyPropertyChanged();
    }
}

private ObservableCollection<Module> myModulesList;

private void RefreshModule()
{
    myModulesList = new ObservableCollection<Module>(sdb.GetModules().OrderBy(mod => mod.Address));
    ModulesView = CollectionViewSource.GetDefaultView(myModulesList);
    ModulesView.Filter = obj =>
        {
            var Module = (Module)obj;
            return SelectedProduct != null && SelectedProduct.ModelNumber == Module.ModelNumber;
        };
}

基本上,如果您想更新数据并在数据网格中显示更改,您只需修改 ObservableCollection myModulesList

以后,当您想填写registerArray 时,您可以使用:

registerArray = myModulesList.OrderBy(mod => mod.Address).Select(mod => mod.ParamValue).ToArray();

【讨论】:

  • 再次感谢您的友好回复。但我有点困惑如何写TodayDispatchCollection
  • @LeeBarry 啊,抱歉,我在复制的部分代码中遗漏了这一点,我将对其进行编辑。
  • 很高兴我能帮上忙 :)
  • 抱歉打扰了!如果我将ObservableCollection 更改为DataSet 会怎样?我应该如何按顺序获得ModulsView?详情:links
猜你喜欢
  • 2015-06-22
  • 2015-05-13
  • 2012-02-16
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多