【发布时间】:2010-01-11 20:59:36
【问题描述】:
我的 datagridview 中有一个列,它是一个组合框列。我希望它按它的显示值(即文本)而不是它的值(在本例中是数据库中的 int 列表)排序。
我该怎么做?
【问题讨论】:
-
您能否包含代码以显示您当前如何填充组合框?
-
它是从数据集中填充的
我的 datagridview 中有一个列,它是一个组合框列。我希望它按它的显示值(即文本)而不是它的值(在本例中是数据库中的 int 列表)排序。
我该怎么做?
【问题讨论】:
您可以通过覆盖DataGridView 上的SortCompare 事件来做到这一点:
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 上有一个设置,以使其成为默认选项。
【讨论】:
这根本不是不可能的。我就是这样做的。
您需要创建一个填充了绑定值的虚拟列。您需要以编程方式执行此操作。
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;
}
【讨论】:
我会看看How to: Customize Sorting in the Windows Forms DataGridView Control。在那篇文章中有三种不同的排序方式。其他一些可能也会有所帮助的帖子:How to sort databound datagridview 和 Custom sort of datagridview
【讨论】:
正如mnield 指出的那样,如果我们有ComboBox 列并且用户希望能够添加行,则上述代码将不起作用。
如果用户希望能够添加新行,那么我们应该使用以下代码:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
【讨论】:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
此代码仅允许按 ID 排序,而不能按 ComboBox 的文本排序。
【讨论】:
显然,这是不可能的。我一直在寻找同样的东西,但我不确定为什么没有人会认为这是一个重要的功能。这是原始问题的链接以及来自 Microsoft 代表的答案。
嗨,马特,
感谢您的发帖。
如果你有 DataGridViewComboBoxColumn 在您的 DataGridView,你必须设置 DataGridView 的 DataSource 到 在其中填充数据。也就是说, 您必须将 DataGridView 绑定到 数据源。
如果您将 SortMode 设置为 DataGridViewComoboBoxColumn 到 自动,您可以按此列排序 点击它。排序基于 列中单元格的值,而不是 格式化值。如果你想 根据 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 属性
你可以参考他下面的链接 有关选项 4 的更多信息: http://msdn2.microsoft.com/en-us/library/system.data.dataview.sort(d=ide).as 像素
好像只有option2和option3 可用于排序 DataGridViewComboBoxColumn 基于 格式化值。然而,这两个 选项仅适用于条件 DataGridView 不受限制 到数据源。
所以在我看来,这是不可能的 对 DataGridViewComboBoxColumn 进行排序 基于 FormattedValue。
如果您有其他问题,请 不要犹豫,让我知道。
此致 Linda Liu Microsoft Online 社区支持
【讨论】:
其实很简单,这是一个对我有用的示例代码:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
第三行是关键。
【讨论】: