【问题标题】:Sort column headers in wpf datagrid from xaml从 xaml 对 wpf 数据网格中的列标题进行排序
【发布时间】:2014-09-04 09:07:24
【问题描述】:
public DataTable Data
{
    get { return _tableData; }
    set
    {
        if (Equals(value, _tableData)) return;
        _tableData = value;
        NotifyOfPropertyChange();
    }   
}

我有我的 xaml 数据网格:

<DataGrid
  HorizontalAlignment="Stretch" 
  IsReadOnly="True" ItemsSource="{Binding Data}" 
  AutoGenerateColumns="True">
</DataGrid>

可以说,有一个DataTable 将在下一列:

  • B 栏
  • 一栏
  • D 柱
  • C 柱

我需要一种通过xaml 按字母顺序表示它们的方法:

  • 一栏
  • B 栏
  • C 柱
  • D 柱

我已经尝试过的:

  1. 具有可排序属性的集合视图源:
<CollectionViewSource x:Key="ColumnsDatagridViewSource" Source="{Binding Data}">
    <CollectionViewSource.SortDescriptions>
        <componentModel:SortDescription PropertyName="ColumnHeader"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

没有帮助,出现了一个数组。它试图在列标题字符串中找到这个属性。

  1. IValue 转换器,它帮助我进行树视图排序:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
   System.Collections.IList collection = value as System.Collections.IList;
   ListCollectionView view = new ListCollectionView(collection);
   SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending);
   view.SortDescriptions.Add(sort);

   return view;
}

【问题讨论】:

    标签: c# sql wpf xaml datagrid


    【解决方案1】:

    由于您是自动生成列,我认为最好的方法是使用DataGrid.AutoGeneratingColumn Event

    我想出了这个代码——小心,没有经过全面测试——按字母顺序重新排列列:

    XAML

    <DataGrid ItemsSource="{Binding Data}"
              AutoGenerateColumns="True"
              AutoGeneratingColumn="dg_AutoGeneratingColumn" />
    

    代码隐藏

    public class DataItem
    {
        public string Name { get; set; }
        public string Ask { get; set; }
        public string Date { get; set; }
        public string Zulu { get; set; }
        public DataItem(string n, string a, string d, string z)
        {
            Name = n;
            Ask = a;
            Date = d;
            Zulu = z;
        }
    }
    
    public partial class MainWindow : Window
    {
        ObservableCollection<DataItem> data = new ObservableCollection<DataItem>();
        public ObservableCollection<DataItem> Data
        {
            get
            {
                return data;
            }
        }
        public MainWindow()
        {
            Data.Add(new DataItem("A", "No", "07/14", "?"));
            Data.Add(new DataItem("B", "Yes", "07/14", "!"));
            Data.Add(new DataItem("C", "Tes", "07/14", "*"));
            Data.Add(new DataItem("D", "No", "07/14", "%"));
            InitializeComponent();
            this.DataContext = this;
        }
    
        private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            DataGrid dg = sender as DataGrid;
            if (dg != null && e != null)
            {
                DataGridColumn currentColumn = e.Column;
                if (currentColumn != null)
                {
                    string currentHeader = currentColumn.Header.ToString();
    
                    int currentIndex = 0;
    
                    // Sort the Columns by name so we add the new column to the correct index
                    foreach (DataGridColumn dgc in (dg.Columns.OrderBy(col => col.Header.ToString())))
                    {
                        if (currentHeader.CompareTo(dgc.Header.ToString()) < 0)
                        {
                            // set the current columns
                            currentColumn.DisplayIndex = currentIndex;
    
                            // short-circuit the loop so we don't keep comparing after we already
                            // found the correct index to place the current column
                            break;
                        }
    
                        currentIndex++;
                    }
                }
            }
        }
    }
    

    不使用dg_AutoGeneratingColumn的输出:

    使用dg_AutoGeneratingColumn输出:

    【讨论】:

      【解决方案2】:

      如果有人对我的做法感兴趣:

      <DataGrid
        HorizontalAlignment="Stretch" 
        IsReadOnly="True"
        IsReadOnly="True" ItemsSource="{Binding Data, Converter={StaticResource DataGridSortingConverter}}" 
        AutoGenerateColumns="True">
      </DataGrid>
      

      我为排序添加了IValueConverter,没什么特别的,需要重构,但你可以得到一个想法:

      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
              {
                  if (value == null)
                      return null;
      
                  var dataTable = value as DataTable;
      
                  if (dataTable != null)
                  {
                      var columnsList = (from object column in dataTable.Columns select column.ToString()).ToList();
      
                      columnsList = columnsList.OrderBy(col => col).ToList();
      
                      for (var i = 0; i < columnsList.Count; i++)
                      {
                          dataTable.Columns[columnsList[i]].SetOrdinal(i);
                      }
      
                      return dataTable;
                  }
      
                  return value;
              }
      

      这段代码的作用:

      首先我从数据表中获取列名,然后按我需要的顺序对它们进行排序。 接下来,我在列上使用内置的SetOrdinal 方法,将其置于正确的位置。

      【讨论】:

        猜你喜欢
        • 2016-10-12
        • 2011-09-22
        • 2023-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2013-06-02
        相关资源
        最近更新 更多