WPF DataGrid按ComboBox字段排序

时间:2009-06-09 08:52:00

标签: wpf datagrid combobox sorting

我有带有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”列的值仍然相同,因此排序后不再正常工作。

有什么想法吗?

4 个答案:

答案 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列和排序工作!

希望这可以帮助处于类似情况的所有人。