, Если Вы обеспечиваете код XSLT и XML-документ, относительно которого Вы наблюдаете проблему, я и другие люди могли попытаться помочь .
Вот являются [приблизительно 1 111] подсказками по использованию и производительности XSLT от [1 112] Michael Kay :
Восемь подсказок для того, как использовать XSLT эффективно :
Восемь подсказок для того, как записать эффективный X SLT:
//item
".
, если Вы можете. Например, при помощи position()
.
, например, для решения группирующихся проблем.
в правиле. preceding[-sibling]
или following[-sibling]
оси. Это часто указывает на алгоритм с n
- производительность в квадрате. node-set()
дополнительная функция.
в предпочтении к [1 110]. Если вы начинаете с ListView, сделайте себе огромное одолжение и используйте вместо него ObjectListView . ObjectListView - это оболочка с открытым исходным кодом для .NET WinForms ListView, которая значительно упрощает использование ListView и решает для вас множество типичных проблем. Сортировка по щелчку столбца - одна из многих вещей, которые она выполняет автоматически.
Серьезно, вы никогда не пожалеете об использовании ObjectListView вместо обычного ListView.
Use the ListView.SortExpression.
When multiple columns are sorted, this property contains a comma-separated list of the fields to sort by.
Я сортирую, используя имя столбца, чтобы установить любые особенности сортировки, которые могут потребоваться обработать, в зависимости от типа данных, хранящегося в столбце, и / или если столбец уже был отсортирован (asc / desc). Вот фрагмент из моего обработчика событий ColumnClick.
private void listView_ColumnClick(object sender, ColumnClickEventArgs e)
{
ListViewItemComparer sorter = GetListViewSorter(e.Column);
listView.ListViewItemSorter = sorter;
listView.Sort();
}
private ListViewItemComparer GetListViewSorter(int columnIndex)
{
ListViewItemComparer sorter = (ListViewItemComparer)listView.ListViewItemSorter;
if (sorter == null)
{
sorter = new ListViewItemComparer();
}
sorter.ColumnIndex = columnIndex;
string columnName = packagedEstimateListView.Columns[columnIndex].Name;
switch (columnName)
{
case ApplicationModel.DisplayColumns.DateCreated:
case ApplicationModel.DisplayColumns.DateUpdated:
sorter.ColumnType = ColumnDataType.DateTime;
break;
case ApplicationModel.DisplayColumns.NetTotal:
case ApplicationModel.DisplayColumns.GrossTotal:
sorter.ColumnType = ColumnDataType.Decimal;
break;
default:
sorter.ColumnType = ColumnDataType.String;
break;
}
if (sorter.SortDirection == SortOrder.Ascending)
{
sorter.SortDirection = SortOrder.Descending;
}
else
{
sorter.SortDirection = SortOrder.Ascending;
}
return sorter;
}
Ниже мой ListViewItemComparer
public class ListViewItemComparer : IComparer
{
private int _columnIndex;
public int ColumnIndex
{
get
{
return _columnIndex;
}
set
{
_columnIndex = value;
}
}
private SortOrder _sortDirection;
public SortOrder SortDirection
{
get
{
return _sortDirection;
}
set
{
_sortDirection = value;
}
}
private ColumnDataType _columnType;
public ColumnDataType ColumnType
{
get
{
return _columnType;
}
set
{
_columnType = value;
}
}
public ListViewItemComparer()
{
_sortDirection = SortOrder.None;
}
public int Compare(object x, object y)
{
ListViewItem lviX = x as ListViewItem;
ListViewItem lviY = y as ListViewItem;
int result;
if (lviX == null && lviY == null)
{
result = 0;
}
else if (lviX == null)
{
result = -1;
}
else if (lviY == null)
{
result = 1;
}
switch (ColumnType)
{
case ColumnDataType.DateTime:
DateTime xDt = DataParseUtility.ParseDate(lviX.SubItems[ColumnIndex].Text);
DateTime yDt = DataParseUtility.ParseDate(lviY.SubItems[ColumnIndex].Text);
result = DateTime.Compare(xDt, yDt);
break;
case ColumnDataType.Decimal:
Decimal xD = DataParseUtility.ParseDecimal(lviX.SubItems[ColumnIndex].Text.Replace("$", string.Empty).Replace(",", string.Empty));
Decimal yD = DataParseUtility.ParseDecimal(lviY.SubItems[ColumnIndex].Text.Replace("$", string.Empty).Replace(",", string.Empty));
result = Decimal.Compare(xD, yD);
break;
case ColumnDataType.Short:
short xShort = DataParseUtility.ParseShort(lviX.SubItems[ColumnIndex].Text);
short yShort = DataParseUtility.ParseShort(lviY.SubItems[ColumnIndex].Text);
result = xShort.CompareTo(yShort);
break;
case ColumnDataType.Int:
int xInt = DataParseUtility.ParseInt(lviX.SubItems[ColumnIndex].Text);
int yInt = DataParseUtility.ParseInt(lviY.SubItems[ColumnIndex].Text);
return xInt.CompareTo(yInt);
break;
case ColumnDataType.Long:
long xLong = DataParseUtility.ParseLong(lviX.SubItems[ColumnIndex].Text);
long yLong = DataParseUtility.ParseLong(lviY.SubItems[ColumnIndex].Text);
return xLong.CompareTo(yLong);
break;
default:
result = string.Compare(
lviX.SubItems[ColumnIndex].Text,
lviY.SubItems[ColumnIndex].Text,
false);
break;
}
if (SortDirection == SortOrder.Descending)
{
return -result;
}
else
{
return result;
}
}
}
Я бы порекомендовал вам datagridview, для тяжелых вещей .. он включает много автоматического списка функций, которого нет
Забудьте о своем пользовательском сортировщике. Начните сначала, используя код на следующей странице. Он покажет вам, как определить класс, который наследуется от интерфейса IComparer. Каждая строка прокомментирована, так что вы можете видеть, что происходит. Единственная потенциальная сложность заключается в том, как вы получаете элементы Listview из элемента управления Listview. Устраните эти проблемы, и вам останется только скопировать и вставить класс интерфейса IComparer и метод columnClick.