#c# #winforms #listview
#c# #winforms #listview
Вопрос:
private void contactsListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
listView1.ListViewItemSorter = new ItemComparer(e.Column); //error
listView1.Sort();
}
class ItemComparer : IComparer<ListViewItem>
{
private int col;
public ItemComparer()
{
col = 0;
}
public ItemComparer(int column)
{
col = column;
}
public int Compare(ListViewItem x, ListViewItem y)
{
int returnVal = -1;
returnVal = String.Compare(x.SubItems[col].Text, y.SubItems[col].Text);
return returnVal;
}
}
Ошибка:
Не удается неявно преобразовать тип ‘Moj_Program.itemComparer’ в ‘System.Коллекции.IComparer’.Существует явное преобразование (вам не хватает приведения?)
Что я делаю не так? На случай, если кому-то нужен весь код, вот он:
public partial class WereToSell : Form
{
Update UpdateStations = new Update();
public WereToSell()
{
InitializeComponent();
}
private void contactsListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
listView1.ListViewItemSorter = new ItemComparer(e.Column);
listView1.Sort();
}
int[] RegionIDs = { 10000054,10000069,10000001,10000036,10000043,10000064,10000037,
10000067,10000067,10000030,10000052,10000049,10000065,10000016,
10000042,10000028,10000048,10000032,10000044,10000020,10000020,
10000038,10000033,10000002,10000068};
string[] RegionNames = { "Aridia","Black Rise","Derelik","Devoid","Domain","Essence","Everyshore","Genesis","Heimatar","Kador","Khanid"
,"Kor-Azor","Lonetrek","Metropolis","Molden Heath","Placid","Sinq Laison","Solitude","Tash-Murkon","The Bleak Lands"
,"The Citadel","The Forge","Verge Vendor"};
public static int ItemNumber;
public static string ItemName;
private void SearchButton_Click(object sender, EventArgs e)
{
string RegionName = comboBox1.Text;
string Ammount = AmmountTextBox.Text;
int ArrayLenght = 0;
for (int i = 0; i < RegionNames.Length; i )
{
if (RegionNames[i] == RegionName)
{
ArrayLenght = i;
break;
}
}
var List = UpdateStations.FindStations(RegionIDs[ArrayLenght], ItemListView.ItemNumber, Convert.ToInt32(Ammount));
for (int i = 0; i < List.Key.Length; i )
{
ListViewItem itemlist = new ListViewItem();
itemlist.Text = List.Value[i];
itemlist.SubItems.Add(List.Key[i].ToString());
itemlist.SubItems.Add(RegionIDs[ArrayLenght].ToString());
listView1.Items.Add(itemlist);
}
}
}
class ItemComparer : Comparer<ListViewItem>
{
private int col;
public ItemComparer()
{
col = 0;
}
public ItemComparer(int column)
{
col = column;
}
public int Compare(ListViewItem x, ListViewItem y)
{
int returnVal = -1;
returnVal = String.Compare(x.SubItems[col].Text, y.SubItems[col].Text);
return returnVal;
}
}
У меня есть еще один вопрос. Что, если я помещу это в метод void вместо нажатия кнопки и просто выполню его, когда захочу? Как должен выглядеть подобный метод?
Комментарии:
1. Возможно, вам следует сделать вывод, что не является универсальным
IComparer
, а неIComparer<T>
2. Попробовал. Это не сработало. Новая ошибка в классе ItemComparer: Comparer<ListViewItem> . ItemComparer не реализует унаследованный абстрактный член
3.
I have another question tho.
Вы должны опубликовать его как новый вопрос.
Ответ №1:
Выводится из Comparer<T>
вместо реализации IComparer<T>
class ItemComparer : Comparer<ListViewItem>
{
....
}
В Comparer<T>
уже реализован нестандартный интерфейс IComparer
, который подходит в вашем случае.
Вот предложение MS:
Мы рекомендуем, чтобы вы производили от класса Comparer<T> вместо реализации интерфейса IComparer<T>, поскольку класс Comparer<T> предоставляет явную реализацию интерфейса IComparer.Метод сравнения и свойство по умолчанию, которое получает средство сравнения по умолчанию для объекта.
Комментарии:
1. Это не сработало. Новая ошибка в классе ItemComparer: Comparer<ListViewItem> . ItemComparer не реализует унаследованный абстрактный член
2. Ошибка не требует пояснений. Вы должны реализовать абстрактный метод
public abstract int Compare(T x,T y)
.3. @user3715205, как я уже упоминал, вы должны
override
использовать унаследованный абстрактный методpublic abstract int Compare(T x,T y)
. Вы этого не сделали, как я вижу в вашем обновленном сообщении.