C# 从xaml对wpf datagrid中的列标题进行排序
我有我的xaml数据网格:C# 从xaml对wpf datagrid中的列标题进行排序,c#,sql,wpf,xaml,datagrid,C#,Sql,Wpf,Xaml,Datagrid,我有我的xaml数据网格: public DataTable Data { get { return _tableData; } set { if (Equals(value, _tableData)) return; _tableData = value; NotifyOfPropertyChange(); } } 没有帮助,出现了一个数组。它尝试在列标题字符串中查找此属性 IValue converter
public DataTable Data
{
get { return _tableData; }
set
{
if (Equals(value, _tableData)) return;
_tableData = value;
NotifyOfPropertyChange();
}
}
没有帮助,出现了一个数组。它尝试在列标题字符串中查找此属性
由于您正在自动生成列,我认为最好的方法是使用 我想出了以下代码--仔细,未经充分测试----按字母顺序重新排列列: XAML
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;
}
代码隐藏
<DataGrid ItemsSource="{Binding Data}"
AutoGenerateColumns="True"
AutoGeneratingColumn="dg_AutoGeneratingColumn" />
公共类数据项
{
公共字符串名称{get;set;}
公共字符串Ask{get;set;}
公共字符串日期{get;set;}
公共字符串Zulu{get;set;}
公共数据项(字符串n、字符串a、字符串d、字符串z)
{
Name=n;
Ask=a;
日期=d;
Zulu=z;
}
}
公共部分类主窗口:窗口
{
ObservableCollection数据=新的ObservableCollection();
公共可观测收集数据
{
得到
{
返回数据;
}
}
公共主窗口()
{
添加(新数据项(“A”、“No”、“07/14”和“?”));
添加(新的数据项(“B”、“是”、“07/14”和“!”));
添加(新数据项(“C”、“Tes”、“07/14”和“*”));
数据。添加(新数据项(“D”、“No”、“07/14”和“%”);
初始化组件();
this.DataContext=this;
}
私有void dg_AutoGeneratingColumn(对象发送方,DataGridAutoGeneratingColumnEventArgs e)
{
DataGrid dg=发送方作为DataGrid;
如果(dg!=null&&e!=null)
{
DataGridColumn currentColumn=e.列;
如果(currentColumn!=null)
{
字符串currentHeader=currentColumn.Header.ToString();
int currentIndex=0;
//按名称对列进行排序,以便将新列添加到正确的索引中
foreach(DataGridColumn-dgc-in(dg.Columns.OrderBy(col=>col.Header.ToString()))
{
if(currentHeader.CompareTo(dgc.Header.ToString())<0)
{
//设置当前列
currentColumn.DisplayIndex=当前索引;
//短路循环,这样我们就不会在已经完成后继续比较了
//找到了放置当前列的正确索引
打破
}
currentIndex++;
}
}
}
}
}
不使用dg_自动生成列的输出:
使用dg_自动生成列进行输出
:
如果有人对我是如何做到的感兴趣:
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++;
}
}
}
}
}
此代码的作用是:
首先,我从datatable中获取列名,然后按需要的顺序对它们进行排序。
接下来,我在列上使用内置的SetOrdinal
方法,将其置于正确的位置
<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++;
}
}
}
}
}
<DataGrid
HorizontalAlignment="Stretch"
IsReadOnly="True"
IsReadOnly="True" ItemsSource="{Binding Data, Converter={StaticResource DataGridSortingConverter}}"
AutoGenerateColumns="True">
</DataGrid>
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;
}