Ошибка сортировки ListView

#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) . Вы этого не сделали, как я вижу в вашем обновленном сообщении.