#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. Спасибо, я начал идти по этому пути, но надеялся, что в элемент управления будет встроено что-то более простое.