C# 按列排序列表视图?
我正在用listview构建一个包含两列的datatable,我需要按第二列对datatable进行排序 它看起来像这样:C# 按列排序列表视图?,c#,winforms,C#,Winforms,我正在用listview构建一个包含两列的datatable,我需要按第二列对datatable进行排序 它看起来像这样: listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending); 点名 --------- 约翰-10 彼得-14 马库斯-9 那么我如何按点数排序呢? 解决了的!! 这对我来说很有魅力。喜欢吗 datatableinstance.DefaultView.Sort = "Points AS
listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending);
点名
---------
约翰-10
彼得-14
马库斯-9
那么我如何按点数排序呢?
解决了的!!
这对我来说很有魅力。喜欢吗
datatableinstance.DefaultView.Sort = "Points ASC";
//基于ID对数据进行排序
假设dt是要排序的datatable对象。你可以随心所欲
如下所述:
现在dt是您的排序数据表
这帮我解决了同样的问题
我发现我必须调整一些数学,因为在按数字排序时,有时会放入1、10、11、12、2、20、21等。使用属性为项目设置自定义IComparer。然后只需调用排序方法: 以下是比较器示例,可用于比较点:
private class PointsComparer : IComparer
{
private const int pointsColumnIndex = 1;
public int Compare(object x, object y)
{
int pointsX = Int32.Parse(((ListViewItem)x).SubItems[pointsColumnIndex].Text);
int pointsY = Int32.Parse(((ListViewItem)y).SubItems[pointsColumnIndex].Text);
return pointsX.CompareTo(pointsY);
}
}
或者,正如我之前发布的,您可以使用msdn示例中的按列文本比较器
更新:您可以将所需的排序顺序传递给比较器的实例:
private class PointsComparer : IComparer
{
private const int pointsColumnIndex = 1;
private SortOrder _sortOrder;
public PointsComparer(SortOrder sortOrder)
{
_sortOrder = sortOrder;
}
public int Compare(object x, object y)
{
int pointsX = Int32.Parse(((ListViewItem)x).SubItems[pointsColumnIndex].Text);
int pointsY = Int32.Parse(((ListViewItem)y).SubItems[pointsColumnIndex].Text);
int comparisonResult = pointsX.CompareTo(pointsY);
switch (_sortOrder)
{
case SortOrder.Ascending:
return comparisonResult;
case SortOrder.Descending:
return (-1) * comparisonResult;
default:
return 0;
}
}
}
然后像这样使用它:
listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending);
这是一些样品
将以下代码粘贴到ListView控件的ColumnClick事件中:
private void listView1_OnColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
ListViewSorter Sorter = new ListViewSorter();
listView1.ListViewItemSorter = Sorter;
if (!(listView1.ListViewItemSorter is ListViewSorter))
return;
Sorter = (ListViewSorter) listView1.ListViewItemSorter;
if (Sorter.LastSort == e.Column)
{
if (listView1.Sorting == SortOrder.Ascending)
listView1.Sorting = SortOrder.Descending;
else
listView1.Sorting = SortOrder.Ascending;
}
else{
listView1.Sorting = SortOrder.Descending;
}
Sorter.ByColumn = e.Column;
listView1.Sort ();
}
分类样本
多重排序
正如Reniuz所说,为了获得更好的性能,在SQL查询中对其进行排序,并在字典、arrayList或通用列表中实现它,还可以使用Datagridview在GUI上显示。。SQL查询语法:
Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ]
语法规则:
Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ]
描述排序从最后一个否排序到第一个或从Z排序到A
ASC排序从第一到最后或从A到Z排序
ASC是默认值。因此,如果您按ASC订购,您可以使用as..order by[Column]。。。无需编写ASC
当使用多个列进行排序时,SQL开始从左到右排序
如果您以后不需要重新排序,您可以在select查询中进行排序。是winforms还是什么?奇怪的是,它与我的答案非常相似。属性为您的项目设置自定义IComparer。什么?如果您使用的是winforms,则ListView控件具有属性ListViewItemSorter。创建您自己的分拣机,该分拣机比较项目并将其设置为listview分拣机。如果您想要下行分拣,请使用return pointsY.CompareTopointsX;相反,或者将比较结果乘以-1,这并不是我想要的。您希望在datatable或listview上进行排序,您希望在其中对数据进行排序。如果在DT上,则可以使用dataview将数据排序为DT.DefaultView.sort=点ASC;我希望能够单击一个按钮对第二列进行排序,以便在我动态添加项目后对其进行排序
listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending);
private void listView1_OnColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
ListViewSorter Sorter = new ListViewSorter();
listView1.ListViewItemSorter = Sorter;
if (!(listView1.ListViewItemSorter is ListViewSorter))
return;
Sorter = (ListViewSorter) listView1.ListViewItemSorter;
if (Sorter.LastSort == e.Column)
{
if (listView1.Sorting == SortOrder.Ascending)
listView1.Sorting = SortOrder.Descending;
else
listView1.Sorting = SortOrder.Ascending;
}
else{
listView1.Sorting = SortOrder.Descending;
}
Sorter.ByColumn = e.Column;
listView1.Sort ();
}
public class ListViewSorter : System.Collections.IComparer
{
public int Compare (object o1, object o2)
{
if (!(o1 is ListViewItem))
return (0);
if (!(o2 is ListViewItem))
return (0);
ListViewItem lvi1 = (ListViewItem) o2;
string str1 = lvi1.SubItems[ByColumn].Text;
ListViewItem lvi2 = (ListViewItem) o1;
string str2 = lvi2.SubItems[ByColumn].Text;
int result;
if (lvi1.ListView.Sorting == SortOrder.Ascending)
result = String.Compare (str1, str2);
else
result = String.Compare (str2, str1);
LastSort = ByColumn;
return (result);
}
public int ByColumn
{
get {return Column;}
set {Column = value;}
}
int Column = 0;
public int LastSort
{
get {return LastColumn;}
set {LastColumn = value;}
}
int LastColumn = 0;
}
Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ]