我有带有combox列的WPF datagrid(ID是实际值,Desc是显示值),当我点击该列的标题时,会自动按实际值(ID)排序。我想按显示值排序。
我的WPF数据网格有4列:IdPerson,DescSchool,IdSchool和School。列“School”是具有以下值的comboBox:ItemSource = schoolTable.DefaultView,SelectedValueBinding = new Binding(“IdSchool”),SelectedValuePath =“IDSchool”,DisplayMemberPath =“DescSchool”
schoolTable是一个包含2列的表 - IDSchool和DescSchool。该表仅用作组合框的数据源。
当我设置了SortMemberPath =“DescSchool”时,我尝试了解决方案,最初,这是有效的 - 当我点击组合框列的标题时,排序是通过显示的值完成的(因为它读取了另一列的值)而不是以实际价值。但是,如果我更改组合框的值,“DescSchool”列的值仍然相同,因此排序后不再正常工作。
有什么想法吗?
答案 0 :(得分:1)
在SortMemberPath="Desc"
设置DataGridComboBoxColumn
(或您的财产名称)应该可以解决问题。
答案 1 :(得分:1)
最近陷入了类似的问题。
尝试类似:
SortMemberPath="School.DescSchool"
希望它会帮助你或其他人!
答案 2 :(得分:0)
我也遇到过这个问题,并且必须在正在排序的类型上实现IComparable。所以在你的情况下,我认为这是学校类型。在IComparable中,请返回:
return this.Desc.CompareTo((obj as School).Desc);
这是我能够实现这一目标的唯一方法,并且由于缺乏回应判断,没有多少人知道更好的方式......抱歉。
此外,这仅在您有权访问类型时才有效。如果这是一个数据表或类似的东西(例如与实体框架相对),这个解决方案将无效。
答案 3 :(得分:0)
我有类似的问题要解决WinForm及其DataGridView在网格中的组合框列中显示关系数据。想要对列进行排序,但排序将按ValueMember(一个int ID字段)排序,而不是DisplayMember(显示的文本字段)。 我使用的是类型化数据集并将其类型化的表放入DataView中,并将该DataView用作BindingSource的数据源,然后是网格的数据源。 : - )
在网上阅读了几篇帖子之后,对我有用的解决方案如下: 在Typed数据集的代码隐藏中,我在主类型表的Typed Row中添加了一些自定义属性。
示例:
public string ProvinceAtRow
{
get
{
string result = string.Empty;
if (!this.CustomerInfoRow.IsProvinceDescriptionNull())
{
result = this.CustomerInfoRow.ProvinceDescription;
}
return result;
}
}
接下来,在具有我的类型化数据集实例的WinForm的代码隐藏中,我在类型表中添加了一个DataColumn。 示例(winForm的Load事件中的代码):
this.DSGrowth.LocalGrowthFactor.Columns.Add(
new DataColumn("Province", typeof(string)));
接下来,当数据集中包含数据时,必须填写已添加的列。 例如:
//if we have data then have to fill in the colums we added to the TDS
if (this.DSGrowth.LocalGrowthFactor.Rows.Count > 0)
{
//fill columns so that can display on datagrid as columns that can be sorted
// ref http://www.daniweb.com/forums/thread283915.html
Array.ForEach<dsLocalGrowthFactor.LocalGrowthFactorRow>( this.DSGrowth.LocalGrowthFactor.Rows.OfType<dsLocalGrowthFactor.LocalGrowthFactorRow>().ToArray(),
row =>
{
row["Province"] = row.ProvinceAtRow;
}
);
//accept changes on TDS so not to be prompted to save changes
this.DSGrowth.AcceptChanges();
}
//set default sort
DataView dvFactors = new DataView(this.DSGrowth.LocalGrowthFactor);
dvFactors.Sort = "GrowthFactor DESC";
this.BSLocalGrowth.DataSource = dvFactors;
this.DgvGrowth.DataSource = this.BSLocalGrowth;
if (this.DgvGrowth.Rows.Count > 0)
{
//select first row
this.BSLocalGrowth.MoveFirst();
this.DgvGrowth.Rows[0].Selected = true;
}
不再有ComboBox列和排序工作!
希望这可以帮助处于类似情况的所有人。