Сортировка строкового столбца по времени не работает в UltraWrid в vb.net
Я разрабатываю настольное приложение и использую Infragistic Controls версии 12.1. Теперь в UltraWinGrid есть такие столбцы, как ID, время, имя, описание и т. Д.
Id Time Name Description
1 10.45 AM - 11:15 AM ABC ABC
2 09:15 AM - 09.45 AM XYZ XYZ
3 02:00 PM - 02.15 PM ABDD ABDD
4 03:00 PM - 03.45 PM EFG EFG
5 01:15 PM - 01:45 PM BCD EFG
Теперь, если я нажму на заголовок любого столбца, кроме столбца времени, и попробую отсортировать, он будет работать нормально. но когда я нажимаю на заголовок столбца времени, он не будет работать. это должно быть возвращено, как следующим образом.
Id Time Name Description
2 09:15 AM - 09.45 AM XYZ XYZ
1 10.45 AM - 11:15 AM ABC ABC
5 01:15 PM - 01:45 PM BCD EFG
3 02:00 PM - 02.15 PM ABDD ABDD
4 03:00 PM - 03.45 PM EFG EFG
но кое как он не вернется правильно. И столбец времени является строковым полем. Так что это сортировка по строковому типу поля. но я хочу отсортировать столбец времени как поле времени. Так что это не работает.
Так может кто-нибудь предложить мне, как это сделать?
Заранее спасибо,
1 ответ
Упомянутое поведение ожидается, потому что ваш столбец [Time] имеет тип данных string. Возможно, один из возможных подходов к решению этой задачи может быть, если вы используете интерфейс IComparer. Таким образом, вы можете реализовать свое собственное поведение сортировки.
У меня есть подобный образец, где я использовал интерфейс IComparer. Там я должен отсортировать целое число по абсолютным значениям. Вы можете использовать этот образец в качестве отправной точки. Более подробную информацию об интерфейсе IComparer вы можете найти по адресу: http://help.infragistics.com/Help/NetAdvantage/WinForms/2013.1/CLR4.0/html/Infragistics4.Win.Misc.v13.1~Infragistics.Win.Misc.NavigationBarLocationsCollection~Sort(IComparer).html
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using Infragistics.Win.UltraWinGrid;
namespace UltraGridSortByABSValue
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("A", typeof(string));
dt.Columns.Add("B", typeof(double));
dt.Columns.Add("C", typeof(double));
dt.Rows.Add("Test 1", 10, 23.3);
dt.Rows.Add("Test 2", 30, 23.4);
dt.Rows.Add("Test 3", -20, 21.3);
dt.Rows.Add("Test 4", -40, 12.3);
dt.Rows.Add("Test 5", -50, -22.7);
dt.Rows.Add("Test 6", 60, 22.3);
dt.Rows.Add("Test 7", -70, 26.8);
dt.Rows.Add("Test 8", 80, 13.3);
dt.Rows.Add("Test 9", 90, 29.1);
ultraGrid1.DataSource = dt;
ultraGrid1.DisplayLayout.Bands[0].Columns["C"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.Currency;
ultraGrid1.DisplayLayout.Bands[0].Columns["C"].Format = "$ #,##0.00;$ -#,##0.00; $ -";
ultraGrid1.DisplayLayout.Bands[0].Columns["C"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
}
private void ultraGrid1_AfterSortChange(object sender, BandEventArgs e)
{
ultraGrid1.DisplayLayout.Bands[0].Columns["B"].SortComparer = new SortComparer();
}
private void ultraGrid1_InitializeGroupByRow(object sender, InitializeGroupByRowEventArgs e)
{
//e.Row.Column.SortComparer = new SortComparer();
}
}
public class SortComparer : IComparer
{
// Custom Sorting - Sort by ABS values
int IComparer.Compare(object x, object y)
{
UltraGridCell cell1 = x as UltraGridCell;
UltraGridCell cell2 = y as UltraGridCell;
string string1 = Math.Abs((double)cell1.Value).ToString();
string string2 = Math.Abs((double)cell2.Value).ToString();
int ret;
if (string1 == null)
{
ret = -1;
}
else
if (string2 == null)
{
ret = 1;
}
else
{
ret = string.Compare(string1, string2, true, System.Globalization.CultureInfo.CurrentCulture);
}
return ret;
}
}
}