2013-10-24 3 views
0

Как контролировать, когда изменяется элемент коллекции (интерфейс: System.Collections.ICollection)? Я пытаюсь сохранить порядок столбцов в System.Windows.Forms.ListView.Columns.Сохранение состояния пользовательского интерфейса в программе C#

Я создал делегат для public event ColumnReorderedEventHandler ColumnReordered;

this.MyListView.ColumnReordered += new System.Windows.Forms.ColumnReorderedEventHandler(ColumnReordered); 

И когда мой класс вызывается:

public void ColumnReordered(object sender, EventArgs e) 
{ 
    ListView.ColumnHeaderCollection chc = sender as ListView.ColumnHeaderCollection; 
    ColumnReorderedEvemtArgs crea = e as ColumnReorderedEventArgs; 
    if ((chc == null) || (crea == null)) return; 

    // Prints expected values. 
    Console.WriteLine("{0} -> {1}", crea.OldDisplayIndex, crea.NewDisplayIndex); 

    // Prints previous state; NOT current state. 
    for (int k = 0; k < chc.Count; k++) 
    { 
     ColumnHeader columnHeader = chc[k] as ColumnHeader; 
     if (columnHeader == null) 
      break; 

     Console.WriteLine("{0}", columnHeader.DisplayIndex); 
    } 
} 

Это приводит меня к мысли, что это не там, где я хочу сохранить состояние как изменения не отражены в возвращенном объекте (sender). Как я могу сохранить упорядочение столбцов сразу же, как пользователь манипулирует ими?

+0

Это потому, что есть возможность отменить переупорядочение - см. Свойство «Отменить» в [ColumnReorderedEventArgs] (http://msdn.microsoft.com/en-us/library/system.windows.forms.columnreorderedeventargs.aspx). Если все прикрепленные обработчики возвращают false в Cancel, предлагаемое изменение будет выполнено. –

+0

Какова цель сохранения порядка столбцов? История, чтобы они могли «отменить» упорядочение столбцов? Разная логика должна выполняться, если в определенном порядке? – Jay

+1

@Jay, я хочу сохранить порядок между использованиями для пользователя. Кроме того, каждый пользователь может иметь свое собственное предпочтительное устройство отображения. –

ответ

0

Я сделал некоторые исследования и некоторые испытания. Часть столбца в виде списка представляет собой отдельный дескриптор окна с именем SysHeader32.

Когда порядок изменения столбцов, дескриптор заголовка принимает сообщение HDM_SETORDERARRAY:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb775369(v=vs.85).aspx

В которой LPARAM содержит указатель на массив, который удерживает измененный порядок столбцов. Например, если у вас есть три столбца, массив хотел бы это, когда ничего не изменилось:

int[] indexes = { 0, 1, 2 }; 

Когда я переключаюсь первые два столбца, массив выглядит следующим образом:

int[] indexes = { 1, 0, 2 }; 

Вы могли бы тогда итерации через массив для извлечения столбцов из вашего элемента управления списком, используя индексы, хранящиеся в массиве.

Таким образом, вы должны найти дескриптор заголовка, а затем установить WndProc, чтобы перехватить входящие сообщения Windows, а затем определить, получен ли HDM_SETORDERARRAY. Если да, прочитайте значение lParam.

Вы можете использовать EnumChildWindows для enumurate/поиск корыта ребенка ручки обрабатывает:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494(v=vs.85).aspx

Для установки крючок, перехватывать сообщения за ручку заголовка, см следующего переполнению стека вопрос:

How do I intercept messages being sent to a window?

Отметим, что HDM_SETORDERARRAY получен, когда индексы уже обновлены.

Смежные вопросы