我正在使用ObjectListView
来显示项目列表。但是,当我单击列标题时,列不会被排序。
请参阅下面粘贴的代码:
public class Stock
{
public Stock()
{
}
public Stock(string name, double lastPrice, double greenTrend, double redTrend, double lastGreenValue, double lastRedValue)
{
this.Name = name;
this.LastPrice = lastPrice;
this.GreenTrend = greenTrend;
this.RedTrend = redTrend;
this.LastGreenValue = lastGreenValue;
this.LastRedValue = lastRedValue;
}
public string Name
{
get { return name; }
set { name = value; }
}
private string name;
public double LastPrice
{
get { return lastPrice; }
set { lastPrice = value; }
}
private double lastPrice;
public double GreenTrend
{
get { return greenTrend; }
set { greenTrend = value; }
}
private double greenTrend;
public double RedTrend
{
get { return redTrend; }
set { redTrend = value; }
}
private double redTrend;
public double LastGreenValue
{
get { return lastGreenValue; }
set { lastGreenValue = value; }
}
private double lastGreenValue;
public double LastRedValue
{
get { return lastRedValue; }
set { lastRedValue = value; }
}
private double lastRedValue;
}
答案 0 :(得分:10)
ShowGroups
的{{1}}属性更改为false时,排序有效。默认设置为true!
答案 1 :(得分:4)
我在ObjectListView
(版本2.6.0)中进行了一些代码更改,以便即使ShowGoups
设置为True
,也可以按不可分组列进行排序。
通过这种方式,可以对Groupable
属性设置为False
的列进行常规排序,并且仍然可以在按Groupable
的列排序时对项进行分组property设置为True。
进行以下更改以获得此行为。
在PostProcessRows()
方法中,交换此代码(在7729
行附近):
if (this.ShowGroups) {
foreach (ListViewGroup group in this.Groups) {
foreach (OLVListItem olvi in group.Items) {
...
由此:
if (this.ShowGroups && ((this.LastSortColumn != null) && this.LastSortColumn.Groupable)) {
foreach (ListViewGroup group in this.Groups) {
foreach (OLVListItem olvi in group.Items) {
...
在DoSort()
方法中,交换此代码(7391
左右):
if (!args.Handled) {
// Sanity checks
if (args.ColumnToSort != null && args.SortOrder != SortOrder.None) {
if (this.ShowGroups)
this.BuildGroups(args.ColumnToGroupBy, args.GroupByOrder, args.ColumnToSort, args.SortOrder,
args.SecondaryColumnToSort, args.SecondarySortOrder);
else if (this.CustomSorter != null)
this.CustomSorter(args.ColumnToSort, args.SortOrder);
else
this.ListViewItemSorter = new ColumnComparer(args.ColumnToSort, args.SortOrder,
args.SecondaryColumnToSort, args.SecondarySortOrder);
}
}
由此:
if (!args.Handled) {
// Sanity checks
if (args.ColumnToSort != null && args.SortOrder != SortOrder.None) {
if (this.ShowGroups && args.ColumnToGroupBy.Groupable)
this.BuildGroups(args.ColumnToGroupBy, args.GroupByOrder, args.ColumnToSort, args.SortOrder,
args.SecondaryColumnToSort, args.SecondarySortOrder);
else if (this.CustomSorter != null)
this.CustomSorter(args.ColumnToSort, args.SortOrder);
else
{
this.Groups.Clear();
this.ListViewItemSorter = new ColumnComparer(args.ColumnToSort, args.SortOrder,
args.SecondaryColumnToSort, args.SecondarySortOrder);
}
}
}
现在可以在一个ObjectListView
组合中对常规列和可分组列进行排序。
答案 2 :(得分:0)
只是添加到Igespee的答案,如果您在没有组并且崩溃的列上使用搜索,则还必须更改以下两行。请记住,这样的更多更改可能是必要的(如之前的GetLastItemInDisplayOrder函数),但这些至少可以防止每次按下键时崩溃。
@@-3948,7 +3948,7 @@ namespace BrightIdeasSoftware
/// <param name="n"></param>
/// <returns></returns>
public virtual OLVListItem GetNthItemInDisplayOrder(int n) {
-- if (!this.ShowGroups)
++ if (!this.ShowGroups || this.Groups.Count==0)
return this.GetItem(n);
foreach (ListViewGroup group in this.Groups) {
@@ -3969,7 +3969,7 @@ namespace BrightIdeasSoftware
/// <param name="itemIndex"></param>
/// <returns></returns>
public virtual int GetDisplayOrderOfItemIndex(int itemIndex) {
-- if (!this.ShowGroups)
++ if (!this.ShowGroups || this.Groups.Count == 0)
return itemIndex;