Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按组内的值对WPF数据网格进行排序_C#_Wpf_Linq - Fatal编程技术网

C# 按组内的值对WPF数据网格进行排序

C# 按组内的值对WPF数据网格进行排序,c#,wpf,linq,C#,Wpf,Linq,我有一个由数据库查询填充的WPF数据网格。初始结果在SQL中分组和排序: 我希望我的用户能够按任意列进行排序,但是简单地按“值”排序会混淆组。我希望组在按指定列排序时保持分组 例如,按“值”列升序排序应按每个组内的最小“值”对组进行排序。结果应该是: 我已经有了一个排序处理程序,我怀疑Linq在这里可能有用,但我似乎找不到一种方法来对Value和GroupName进行排序。这是一个小示例,如何按照您的意愿进行分组,您可以更改它,您的列表来自db,您可以像我一样进行排序,并且不要忘记IComp

我有一个由数据库查询填充的WPF数据网格。初始结果在SQL中分组和排序:

我希望我的用户能够按任意列进行排序,但是简单地按“值”排序会混淆组。我希望组在按指定列排序时保持分组

例如,按“值”列升序排序应按每个组内的最小“值”对组进行排序。结果应该是:


我已经有了一个排序处理程序,我怀疑Linq在这里可能有用,但我似乎找不到一种方法来对Value和GroupName进行排序。

这是一个小示例,如何按照您的意愿进行分组,您可以更改它,您的列表来自db,您可以像我一样进行排序,并且不要忘记IComparable

static void Main(string[] args)
    {
        List<MyClass> inputlist = new List<MyClass>();
        inputlist.Add(new MyClass { GroupName = "A", Value = 10 });
        inputlist.Add(new MyClass { GroupName = "A", Value = 15 });
        inputlist.Add(new MyClass { GroupName = "A", Value = 20 });
        inputlist.Add(new MyClass { GroupName = "B", Value = 1 });
        inputlist.Add(new MyClass { GroupName = "B", Value = 10 });
        inputlist.Add(new MyClass { GroupName = "B", Value = 15 });
        inputlist.Add(new MyClass { GroupName = "C", Value = 5 });
        inputlist.Add(new MyClass { GroupName = "C", Value = 10 });
        inputlist.Add(new MyClass { GroupName = "C", Value = 15 });

        List<MyClass> outputlist = new List<MyClass>();

        foreach (var item in 
                inputlist.GroupBy(x => x.GroupName).Select(x => new MyClass
                {
                    GroupName = x.First().GroupName,
                    Value = x.Min().Value
                }).ToList().OrderBy(x => x.Value))
        {
            outputlist.AddRange(inputlist.Where(x => x.GroupName == item.GroupName));
        }

        foreach (var item in outputlist)
        {
            Console.WriteLine(item.GroupName + " " + item.Value);
        }
        Console.ReadLine();
    }
}

public class MyClass : IComparable
{
    public string GroupName { get; set; }
    public int Value { get; set; }

    public int CompareTo(object value)
    {
        int val = (int)Value;
        if (this.Value > val) return -1;
        if (this.Value == val) return 0;
        return 1;
    }

}
static void Main(字符串[]args)
{
List inputlist=新列表();
Add(新的MyClass{GroupName=“A”,Value=10});
Add(新的MyClass{GroupName=“A”,Value=15});
Add(新的MyClass{GroupName=“A”,Value=20});
Add(newmyclass{GroupName=“B”,Value=1});
Add(newmyclass{GroupName=“B”,Value=10});
Add(newmyclass{GroupName=“B”,Value=15});
Add(newmyclass{GroupName=“C”,Value=5});
Add(newmyclass{GroupName=“C”,Value=10});
Add(newmyclass{GroupName=“C”,Value=15});
List outputlist=新列表();
foreach(中的var项)
GroupBy(x=>x.GroupName)。选择(x=>newmyclass
{
GroupName=x.First().GroupName,
值=x.Min().Value
}).ToList().OrderBy(x=>x.Value))
{
AddRange(inputlist.Where(x=>x.GroupName==item.GroupName));
}
foreach(outputlist中的变量项)
{
Console.WriteLine(item.GroupName+“”+item.Value);
}
Console.ReadLine();
}
}
公共类MyClass:IComparable
{
公共字符串组名{get;set;}
公共int值{get;set;}
公共整数比较(对象值)
{
int val=(int)值;
如果(this.Value>val)返回-1;
if(this.Value==val)返回0;
返回1;
}
}

这是一个小例子,如何按照您的意愿进行分组,您可以更改它,您的列表来自db,您可以像我一样进行分组,并且不要忘记IComparable

static void Main(string[] args)
    {
        List<MyClass> inputlist = new List<MyClass>();
        inputlist.Add(new MyClass { GroupName = "A", Value = 10 });
        inputlist.Add(new MyClass { GroupName = "A", Value = 15 });
        inputlist.Add(new MyClass { GroupName = "A", Value = 20 });
        inputlist.Add(new MyClass { GroupName = "B", Value = 1 });
        inputlist.Add(new MyClass { GroupName = "B", Value = 10 });
        inputlist.Add(new MyClass { GroupName = "B", Value = 15 });
        inputlist.Add(new MyClass { GroupName = "C", Value = 5 });
        inputlist.Add(new MyClass { GroupName = "C", Value = 10 });
        inputlist.Add(new MyClass { GroupName = "C", Value = 15 });

        List<MyClass> outputlist = new List<MyClass>();

        foreach (var item in 
                inputlist.GroupBy(x => x.GroupName).Select(x => new MyClass
                {
                    GroupName = x.First().GroupName,
                    Value = x.Min().Value
                }).ToList().OrderBy(x => x.Value))
        {
            outputlist.AddRange(inputlist.Where(x => x.GroupName == item.GroupName));
        }

        foreach (var item in outputlist)
        {
            Console.WriteLine(item.GroupName + " " + item.Value);
        }
        Console.ReadLine();
    }
}

public class MyClass : IComparable
{
    public string GroupName { get; set; }
    public int Value { get; set; }

    public int CompareTo(object value)
    {
        int val = (int)Value;
        if (this.Value > val) return -1;
        if (this.Value == val) return 0;
        return 1;
    }

}
static void Main(字符串[]args)
{
List inputlist=新列表();
Add(新的MyClass{GroupName=“A”,Value=10});
Add(新的MyClass{GroupName=“A”,Value=15});
Add(新的MyClass{GroupName=“A”,Value=20});
Add(newmyclass{GroupName=“B”,Value=1});
Add(newmyclass{GroupName=“B”,Value=10});
Add(newmyclass{GroupName=“B”,Value=15});
Add(newmyclass{GroupName=“C”,Value=5});
Add(newmyclass{GroupName=“C”,Value=10});
Add(newmyclass{GroupName=“C”,Value=15});
List outputlist=新列表();
foreach(中的var项)
GroupBy(x=>x.GroupName)。选择(x=>newmyclass
{
GroupName=x.First().GroupName,
值=x.Min().Value
}).ToList().OrderBy(x=>x.Value))
{
AddRange(inputlist.Where(x=>x.GroupName==item.GroupName));
}
foreach(outputlist中的变量项)
{
Console.WriteLine(item.GroupName+“”+item.Value);
}
Console.ReadLine();
}
}
公共类MyClass:IComparable
{
公共字符串组名{get;set;}
公共int值{get;set;}
公共整数比较(对象值)
{
int val=(int)值;
如果(this.Value>val)返回-1;
if(this.Value==val)返回0;
返回1;
}
}

您确实需要以以下方式实现排序处理程序(请参见代码中的注释):

private void OnSorting(对象发送方、DataGridSortingEventArgs e){
if(e.Column.SortMemberPath==“Value”){
//查看
var source=(ListCollectionView)CollectionViewSource.GetDefaultView(this.Items);
//手动将排序方向更改为下一个值
//所以空值>上升>下降>返回空值
var sort=e.Column.SortDirection;
if(sort==null)
排序=ListSortDirection.升序;
else if(sort==ListSortDirection.升序)
排序=ListSortDirection.Descending;
其他的
sort=null;
if(排序!=null){
//首先找出正确的组顺序
var sortedGroups=dataGrid.ItemsSource.OfType()
.GroupBy(c=>c.GroupName)
.Select(c=>new{GroupName=c.Key,MinValue=c.Min(r=>r.Value)})
.OrderBy(c=>c.MinValue)
.Select(c=>c.GroupName)
.ToArray();
//现在将“集合视图自定义排序”设置为“输出比较器”
source.CustomSort=newitemparator(sortedGroups,sort==ListSortDirection.Ascending);
}
否则{
//否则,请删除自定义排序并按常规排序
source.CustomSort=null;
}
e、 Column.SortDirection=排序;
e、 已处理=正确;
}
}
公共类项比较程序:IComparer{
私有只读字符串[]_sortedGroups;
私有只读bool\u asc;
公共项比较器(字符串[]SortedGroup,布尔asc){
_sortedGroups=sortedGroups;
_asc=asc;
}
公共整数比较(对象ox、对象oy){
变量x=(项目)ox;
变量y=(项目)oy;
如果(x.G