Как вы обрабатываете SelectedIndex сортируемого ListView?

#asp.net #listview #sorting

#asp.net #listview #сортировка

Вопрос:

У меня есть asp.net Сортируемый ListView.

У меня есть кнопка с названием команды «выбрать». Когда я нажимаю на кнопку, выбирается соответствующая строка. Если я затем нажму на заголовок сортировки, ListView выполнит сортировку, но выбранный индекс останется прежним. Другими словами, если я щелкну по 2-й строке, то сортировка 2-й строки все еще будет выбрана.

Есть ли способ заставить ListView выбрать соответствующую строку после сортировки, чтобы, если я щелкну по элементу, а затем отсортирую, тот же элемент все равно был выбран, но в другой позиции в зависимости от сортировки?

Ответ №1:

Вы должны сделать это программно — хотя решение несколько неприятное. Первым шагом является определение ключей данных и событий onSorting и Sorted в ListView, как показано ниже

   <asp:ListView ID="ListView1" runat="server"  DataSourceID="SqlDataSource1"  DataKeyNames="AddressId,AddressLine1"
            onsorting="ListView1_Sorting" onsorted="ListView1_Sorted">
  

Затем в коде, лежащем в основе, вы должны обрабатывать события.Поскольку DataItems в коллекции Items всегда имеет значение null, а dataIndex и DisplayIndex установлены не так, как можно было бы обычно ожидать, мы должны использовать DataKeys .Сохраняйте ключ данных выбранного элемента до сортировки и после поиска сортировки по коллекции ключей данных для сопоставления с сохраненным ключом данных. Смотрите ниже

  private DataKey dk;

        protected void ListView1_Sorting(object sender, ListViewSortEventArgs e)
        {
          dk=  (ListView1.SelectedIndex > 0) ? ListView1.DataKeys[ListView1.SelectedIndex] : null;
        }
        protected void ListView1_Sorted(object sender, EventArgs e)
        {
            if (dk == null) return;
            int i;
            ListView1.DataBind();
            for (i = 0; i < ListView1.DataKeys.Count; i  )
               if(AreEqual(ListView1.DataKeys[i].Values,dk.Values)) break;
            if (i >= ListView1.DataKeys.Count) return;
            ListView1.SelectedIndex =i;
        }
        private bool AreEqual(System.Collections.Specialized.IOrderedDictionary x, System.Collections.Specialized.IOrderedDictionary y)
        {
            for (int i = 0; i < x.Count; i  )
                if (!x[i].Equals(y[i])) return false;
            return true;
        }
  

Комментарии:

1. Спасибо, я начал идти по этому пути, но надеялся, что в элемент управления будет встроено что-то более простое.