Как вы обрабатываете SelectedIndex сортируемого ListView? - PullRequest
0 голосов
/ 23 июня 2010

У меня есть сортировка asp.net ListView.

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

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

1 Ответ

1 голос
/ 23 июня 2010

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

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

Тогда в коде позади вы должны обработать события. Так как DataItems в коллекции Items всегда нулевые, а DataIndex и DisplayIndex не установлены, как обычно можно ожидать, мы должны использовать DataKeys.Store datakey выбранного Item перед сортировкой и после сортировки ищите в коллекции DatakEy, чтобы соответствовать сохраненному ключу данных. Смотри ниже

 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...