Автор |
Сообщение |
AlexRock Гуру |
|
Я пытаюсь в комбобоксе организовать поведение браузерной строки адреса (чтобы помнил историю и можно было выбирать любой из ранее посещённх адресов). Возникла проблема - как обновлять коллекцию комбобокса при выборе значения из этой коллекции, чтобы ещё правильно свойство Text отображалось? Дело в том, что при выборе элемента из коллекции комбобокса возникает событие SelectedIndexChanged, после которого в Text отображается выбранный элемент. Но если я в обработчике SelectedIndexChanged буду обновлять коллекцию комбобокса (добавлять выбранное значение в историю), то Text затирается. Если я при этом принудительно присвою Text то, что было в нём раньше, то снова возникает SelectedIndexChanged и появляется бесконечный цикл. В Интернете лучшее и самое понятное, что нашёл, это отписываться от события SelectedIndexChanged во время присвоения свойству Text значения и, возможно, при изменении самой коллекции комбобокса (хотя мне хватило для изменения свойства Text), а после изменений снова подписываться. Это, конечно, работает, но неужели для такой простой вещи, как сохранение истории в комбобоксе, нужно делать выкрутасы с подпиской-отпиской на события? Ведь пользователь постоянно в строке адреса чего-то меняет, так не вредны ли эти частые подписки-отписки? Мне такой подход не нравится - как-то топорно выглядит. Есть ли варианты лучше? Как вообще это принято делать?
Вот мой примерный код. История посещённых адресов хранится в специальной коллекции, которая, когда надо, заполняет коллекцию Items комбобокса.
Код: |
private void pathComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
// Сохраняю выбранный элемент в строке.
string currentDirectory = (string)((ComboBox)sender).SelectedItem;
// Далее дополняю историю ранее введённых адресов выбранным в комбобоксе значением (этого кода здесь нет, ибо тривиально). Затем очищаю комбобокс.
pathComboBox.Items.Clear();
// Затем снова заполняю комбобокс обновлённой историей (опять без кода, ибо тривиально). Но, т. к. текстовое поле кобобокса теперь пустое, то принудительно утанавливаю его, предварительно отписавшись от обработчика, чтобы не возникло цикла. Потом восстанавливаю обработчик.
pathComboBox.SelectedIndexChanged -= new System.EventHandler(this.pathComboBox_SelectedIndexChanged);
pathComboBox.Text = currentDirectory;
pathComboBox.SelectedIndexChanged += new System.EventHandler(this.pathComboBox_SelectedIndexChanged);
} |
Зачем мне нужно очищать коллекцию комбобокса? Потому что мне нужна реверсная коллекция, т. е. введённые адреса должны быть в обратном порядке (последний введённый - в самом верху), а умолчальное поведение комбобокса обратное - последний введённый находится в самом низу. Так что я при заполнении коллекции комбобокса сначала сортировку в обратном порядке делаю в специальном массиве, который хранит эту же историю, а отсортировать саму коллекцию комбобокса напрямую нельзя. |
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|