WPF DataGrid сортировка по полю ComboBox - PullRequest
0 голосов
/ 09 июня 2009

У меня есть таблица данных WPF со столбцом combox (ID - реальное значение, Desc - отображаемое значение), и когда я щелкаю заголовок этого столбца, автоматически сортируется по реальному значению (ID). Я хочу отсортировать по отображаемому значению.

Моя таблица данных WPF имеет 4 столбца: IdPerson, DescSchool, IdSchool и School. Столбец «Школа» является комбинированным списком со следующими значениями: ItemSource = schoolTable.DefaultView, SelectedValueBinding = новая привязка («IdSchool»), SelectedValuePath = «IDSchool», DisplayMemberPath = «DescSchool»

schoolTable - это таблица с 2 столбцами - IDSchool и DescSchool. Эта таблица используется просто как источник данных для выпадающего списка.

Я попробовал решение, когда я установил SortMemberPath = "DescSchool" и изначально это работает - когда я щелкаю по заголовку столбца комбинированного списка, сортировка выполняется по отображаемому значению (потому что оно читает значение другого столбца), а не по реальной стоимости. Но если я изменю значение поля со списком, значение столбца «DescSchool» останется прежним, поэтому после этого сортировка перестанет работать должным образом.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 29 января 2014

недавно попала в подобную проблему.

попробуйте что-то вроде:

SortMemberPath="School.DescSchool"

Надеюсь, это поможет вам или кому-то еще!

1 голос
/ 09 июня 2009

Установка SortMemberPath="Desc" (или как называется ваша собственность) на DataGridComboBoxColumn должна помочь.

0 голосов
/ 13 октября 2010

У меня была похожая проблема, которую нужно решить с помощью WinForm и его DataGridView, отображающего реляционные данные в столбце комбинированного списка в сетке. Требуется отсортировать столбец, но сортировка будет выполняться по ValueMember (поле int ID), а не по DisplayMember (отображается текстовое поле). Я использовал типизированный набор данных и поместил его типизированную таблицу в DataView и использовал этот DataView в качестве источника данных для BindingSource, который был тогда источником данных для сетки. : -)

После прочтения нескольких постов в Интернете у меня получилось следующее решение: В кодовом наборе набора типизированных данных я добавил некоторые настраиваемые свойства в типизированную строку моей основной типизированной таблицы.

Пример:

        public string ProvinceAtRow
        {
            get
            {
                string result = string.Empty;
                if (!this.CustomerInfoRow.IsProvinceDescriptionNull())
                {
                    result = this.CustomerInfoRow.ProvinceDescription;
                }
                return result;
            }
        }

Затем в программном обеспечении WinForm, в котором есть экземпляр моего типизированного набора данных, я добавил DataColumn в типизированную таблицу. Пример (код в событии Load в winForm):

        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!

Надеюсь, это поможет всем, кто находится в подобной ситуации.

0 голосов
/ 25 июня 2010

У меня также была эта проблема, и мне пришлось реализовать IComparable для сортируемого типа. Так что в вашем случае я думаю, что это школа типа. Внутри IComparable, верните это:

return this.Desc.CompareTo((obj as School).Desc);

Это единственный способ заставить это работать, и, судя по отсутствию ответов, немногие знают лучший способ ... извините.

Кроме того, это будет работать, только если у вас есть доступ к типам. Если это дата-данные или что-то в этом роде (в отличие от Entity Framework, например), это решение не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...