Я что-то упустил с моей обработкой события выбора ListView - PullRequest
1 голос
/ 27 февраля 2009

... или c # listviews действительно такой кошмар для управления?

Хорошо, проблема, над которой я работаю, очень проста. Или, по крайней мере, это так:

У меня есть текстовый файл, который содержит информацию о заказах клиентов в отдельных строках. Элементы данных разделены точками с запятой.

Моя форма выполняет итерации по этим заказам, помещает информацию об элементе в хеш-таблицы и помещает каждую хеш-таблицу в главную хеш-таблицу. Некоторая сводная информация о каждом заказе (продукт / заказ № / имя клиента / клиент №) отображается в моем списке просмотра, разделенном сортируемыми столбцами. Ниже списка представлен элемент управления вкладками с текстовыми полями для редактируемых частей деталей заказа, распределенных по трем вкладкам.

Вот что я хотел бы случиться:

  • Пользователь нажимает на одну запись: текстовые поля управления вкладками заполняются деталями заказа.
  • Пользователь редактирует детали в элементе управления вкладкой.
  • Пользователь нажимает на другой заказ: подтверждающее сообщение проверяет, что изменение должно быть зафиксировано, если «Да», то детали должны быть сохранены обратно в соответствующую Hashtable и отображение в списке обновлений.
  • Пользователь выбирает несколько элементов списка: верхний элемент должен редактироваться в элементе управления вкладкой.
  • Пользователь нажимает кнопку «Удалить элементы» на панели инструментов в верхней части формы: элементы удаляются из хеш-таблицы, а элемент управления списком обновляется, чтобы отразить удаление. Все текстовые поля возвращаются пустыми в элементе управления вкладками.

Мне кажется, это довольно обычное и разумное поведение. Я предположил, что использование события SelectedIndexChanged предоставит возможности для работы с данными. Но событие запускается дважды при каждом выборе / отмене выбора, и не всегда ясно, какие элементы должны обновляться в представлении списка в какой момент.

Код для проверки того, какой тип «выбора / отмены выбора» только что произошел, и определения того, какие действия следует предпринять, начинает становиться довольно длинным, и мне просто интересно, не усложняю ли я все. *

Итак:

  • Есть ли другое событие, которое я мог бы использовать для достижения своих функциональных целей? Или
  • Есть ли что-то в событии SelectedIndexChanged, которое я не знаю, которое помогло бы программе решить, что она должна делать в данный момент? Или
  • Я просто поступаю неправильно?

Любые предложения, даже предложения по изменению формы, будут приветствоваться.

РЕДАКТИРОВАТЬ: пытаясь атаковать эту проблему под другим углом, я меняю свою главную хэш-таблицу на сортированный список. Остальная часть проблемы остается той же.

Ответы [ 2 ]

0 голосов
/ 02 марта 2009

Вместо обновления пользовательского интерфейса при запуске SelectedIndexChanged на ListView, запустите Timer с коротким Duration (скажем, по умолчанию 100 мс) и выполните обновления пользовательского интерфейса в обработчике Timer.Tick.

Например:

  1. Перетащите ListView и Timer на WinForm
  2. Добавление набора элементов в ListView с помощью конструктора
  3. Добавление обработчиков для события ListView SelectedIndexChanged и события Timer Tick
  4. Заменить существующий код на:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    timer1.Start();
}

private string GetIndices()
{
    string indices = "";
    foreach (int i in listView1.SelectedIndices)
    {
        indices += i.ToString() + ", ";
    }

    if (indices.Length > 0)
    {
        indices = indices.Substring(0, indices.Length - 2);
    }

    return indices;
}

private void timer1_Tick(object sender, EventArgs e)
{
    timer1.Stop();
    Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") +
        ". Selected indices = " + GetIndices());
}

Это работает, потому что события отмены выбора и повторного выбора происходят очень близко друг к другу - быстрее, чем Timer Duration. Использование Timer таким образом означает, что пара будет обрабатываться как одно составное событие.

Надеюсь, это поможет.

0 голосов
/ 27 февраля 2009

Не зная кода, который «начинает становиться довольно длинным», я бы предложил следующее:

Убедитесь, что Listview1.MultiSelect имеет значение false. Используйте поле (или свойство) в вашей Форме для отслеживания SelectedItem. В этом случае проверьте, если новый ListView1.Selecteditems [0]! = This.SelectedItem

Часть 2. Взгляните на DataGridView и DataTables как на альтернативное решение. Ваши данные звучат довольно "реляционно", а в Data есть много функций фильтрации / сортировки / связывания. Вы можете прикрепить List как DataSource к Grid или пойти немного дальше и прочитать ваши данные в DataTables.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...