我的datagridview中有一个列是一个组合框列。我希望它按显示值(即文本)排序,而不是它的值(在这种情况下,是数据库中的int列表)。
我该怎么做?
答案 0 :(得分:5)
您可以通过覆盖SortCompare
上的DataGridView
事件来执行此操作:
当DataGridView比较两个单元格值以执行排序操作时发生
并始终按显示值而非默认值排序。
SortCompare
事件连接到DataGridView,如下所示:this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare);
Cell
的FormattedValue
属性而不是Value
属性(默认值)对所有列进行排序。 void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
var dgv = (DataGridView) sender
string value1 = dgv.Rows[e.RowIndex1].Cells[e.Column.Index].FormattedValue.ToString();
string value2 = dgv.Rows[e.RowIndex2].Cells[e.Column.Index].FormattedValue.ToString();
e.SortResult = System.String.Compare(value1, value2);
e.Handled = true;
}
适合我,希望能帮助其他人。我只是希望DataGridView
上有一个设置,使其成为默认选项。
答案 1 :(得分:2)
根本不可能做到这一点。这就是我做到的。
创建填充了绑定值的虚拟列所需的内容。您需要以编程方式执行此操作。
private void OrderByComboBoxColumn()
{
// Add the temp Column if it doesnt exist
if (!dataset.TABLE.Columns.Contains("TempColumn"))
dataset.TABLE.Columns.Add("TempColumn", typeof(string));
foreach (DataSetRow row in dataset.TABLE)
row["TempColumn"] = GetBoundValue(row.COMBOBOX_ID);
dataview.Sort = "TempColumn ASC";
}
private string GetBoundValue(int id)
{
// get the string however your id matches the bound value
return string;
}
答案 2 :(得分:1)
我会看看How to: Customize Sorting in the Windows Forms DataGridView Control。在该文章中有三种不同的排序方式。其他一些帖子也可能会有所帮助:How to sort databound datagridview和Custom sort of datagridview
答案 3 :(得分:1)
正如mnield所指出的,如果我们有ComboBox
列并且用户希望能够添加行,则上述代码将无效。
如果用户希望能够添加新行,那么我们应该使用以下代码:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
答案 4 :(得分:0)
显然,这是不可能的。我一直在寻找相同的东西,我不确定为什么没有人会认为这是一个重要的特征。这是原始问题的链接和Microsoft Rep。
的答案马特,
感谢您发帖。
如果你有 您的DataGridViewComboBoxColumn DataGridView,你必须设置 DataGridView的DataSource 填充数据。那就是说, 您必须将DataGridView绑定到 数据源。
如果设置了SortMode DataGridViewComoboBoxColumn到 自动,您可以按此排序此列 点击它。排序基于 列中的单元格值,而不是 FormattedValue。如果你想 根据此列对此列进行排序 FormattedValue,好像你有 自定义排序。
有几种自定义选项 一种DataGridView。这些选项 如下所列。 1.调用DataGridView.Sort(DataGridViewColumn,ListSortDirection) 方法 2.使用DataGridView的SortCompare事件进行处理 3.调用DataGridView.Sort(IComparer)方法
您可以参考以下链接 关于以上三点的更多信息 选项: http://msdn2.microsoft.com/en-us/library/ms171608(d=ide).aspx
- 使用DataView并设置其Sort属性
醇>你可以参考下面的链接 有关option4的更多信息: http://msdn2.microsoft.com/en-us/library/system.data.dataview.sort(d=ide).as PX
似乎只有option2和option3 可以应用于排序 DataGridViewComboBoxColumn基于 FormattedValue。但是,这两个 选项仅适用于该条件 DataGridView没有限制 到数据源。
所以在我看来,这是不可能的 对DataGridViewComboBoxColumn进行排序 基于FormattedValue。
如果您有其他疑虑,请 不要犹豫,让我知道。
此致,Linda Liu微软在线 社区支持
答案 5 :(得分:0)
事实上很简单,这是一个适合我的示例代码:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
第三行是关键。
答案 6 :(得分:0)
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
此代码仅允许按ID排序,而不是按ComboBox的文本排序。