У меня была похожая проблема, которую нужно решить с помощью 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!
Надеюсь, это поможет всем, кто находится в подобной ситуации.