我想基于“产品名称”列值对DataGrid
视图中的行进行排序。因此,例如,上述列的可能值为:“模块”,“ RX5000”,“ RM5000”。如果我的gridview有10行,并且“产品名称”列具有以下顺序的值:
RX5000 RM5000 RM5000 Module RX5000 RX5000 RM5000 Module RX5000 RM5000
单击按钮后,我希望它们按以下顺序显示(在同一gridview中显示):
Module Module RX5000 RX5000 RX5000 RX5000 RM5000 RM5000 RM5000 RM5000
我如何在C#中获得它?
我想到了创建每种产品的列表,然后遍历每一行并根据产品名称填充列表,然后以某种方式将3个列表合并为第4个列表,然后将第4个列表分配给我的mergeview 。但是我有12个产品(我在这里只显示3个),所以我不想有12个列表。我希望它更具动态性。
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
string cell1, cell2;
if (e.Column == "Your_Column")
{
if (e.CellValue1 == null) cell1 = "";
else cell1 = e.CellValue1.ToString();
if (e.CellValue2 == null) cell2 = "";
else cell2 = e.CellValue2.ToString();
if (cell1 == "Account Manager") { e.SortResult = -1; e.Handled = true; }
else
{
if (cell2 == "Account Manager") { e.SortResult = 1; e.Handled = true; }
else
{
if (cell1 == "Assistant Account Manager") { e.SortResult = -1; e.Handled = true; }
else
{
if (cell2 == "Assistant Account Manager") { e.SortResult = 1; e.Handled = true; }
}
}
}
}
}
我在不同的Post中找到了上面的代码,但是我不知道如何将其应用于我的问题,甚至不知道是否可以将其应用于我的问题。
答案 0 :(得分:0)
The answer you found是最大的难题:您需要订阅并处理DataGridView.SortCompare
事件。不幸的是,您在此处找到的代码非常特定于该特定场景。它假定最多有一个“特殊”名称,并且对其余名称没有任何特殊的顺序。
在您的示例中,尚不清楚为什么要订购"RX5000"
使其位于"RM5000"
之前。正常的字母排序将使它们颠倒。但是,假设与“正常字母排序”的偏差确实是您的问题,那么您需要做的就是定义所需的顺序,然后在事件处理程序SortCompare
中引用该顺序。>
例如,您可以执行以下操作:
private readonly Dictionary<string, int> _sortOrder = new[] { "Module", "RX5000", "RM5000" }
.Select((s, i) => new KeyValuePair<string, int>(s, i))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
e.SortResult = _sortOrder[e.CellValue1.ToString()].CompareTo(_sortOrder[e.CellValue2.ToString()]);
e.Handled = true;
}
_sortOrder_
字典是通过枚举一个数组元素来构造的,您可以按照要对其进行排序的顺序将它们定义为字符串,并使用字符串值及其在数组中的索引来创建用于初始化字典的键/值对。这样具有为字符串分配特定数值的效果,其顺序与您希望对字符串进行排序的顺序相同。
然后声明dataGridView1_SortCompare()
方法,该方法的实现是将比较简单地委派给分配给字符串的数值的比较。即从_sortOrder
检索第一个单元格的字符串表示形式的数值,并将该值与第二个单元格的字符串表示形式的数值(也从_sortOrder
检索出来)进行比较。>