powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Listview. Событие SelectIndexChanged срабатывает несколько раз
25 сообщений из 27, страница 1 из 2
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38400904
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех приветствую!
Есть ListView - 1 столбец.
На событие SelectIndexChanged повешен обработчик.
Проблема в том, что при смене (и даже не смене) выбора строки событие срабатывает по несколько раз.
причём когда выбираю какую нить строку в первый раз, тоесть сразу после загрузки формы - всё ок. но потом, с каждым выбором кол-во выполнения обработки события растёт в разы... не могу понять в чём дело....
подсобит кто нить?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401336
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J_Mnemonic,

А пример кода или хотя-бы простой проект воспроизводящий ошибку приведёте?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401747
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
приложил пример.
Как я понял, проблема связана с таймером и с какой то особеностью ListViewer
Таймер использую потому, что на выбор приличная логика повешена. И если делать её сразу при выборе item, то выделение айтема происходит несколько заторможено - что визуально дискомфортно. а так, если инфа появится через пол секунды (даже четверть) вполне было бы сносно... но эти глюки...
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401768
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2J_Mnemonic
вы знаете толк в извращениях.
Тупое решение:
Код: c#
1.
2.
            timer1.Tick -= selectItems;
            timer1.Tick += selectItems;


Но не делайте так, неправильно все это)))
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401775
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerP1983,

ну так подскажите как правильно? :)
я пока ещё без году неделя программист в C#
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401790
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Какой фреймворк?
2) "на выбор приличная логика повешена" - какая? Есть ли взаимодействие с ui?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401799
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerP1983,

1 - 4.0
2 - есть. Подсвечиваются всякие статусы, лэйбэлы и т.п. (по ним я и заметил что несклько раз срабатывает -мигать стали)
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401821
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ах, да. на счёт логики. там из базы тянутся значения для выбранного человека. ну тоесть небольшая задержка но есть
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401869
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воткните в свой пример

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
        private int Count = 0;

        public Form1()
        {
            InitializeComponent();
            listDrivers.ItemSelectionChanged += ListDriversOnItemSelectionChanged;
        }

        private void ListDriversOnItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs args)
        {
            if (args.IsSelected)
            {
                Task.Factory
                    .StartNew<bool>(DoLongOperation)
                    .ContinueWith(t => DoAfterLongOperation(args.Item, t.Result), TaskScheduler.FromCurrentSynchronizationContext());

                this.Text = "Count: " + Count++;
            }            
        }

        private bool DoLongOperation()
        {
            Thread.Sleep(250);
            var isNeedLightSomeLabel = Convert.ToBoolean(DateTime.Now.Millisecond % 2);
            return isNeedLightSomeLabel;
        }

        private void DoAfterLongOperation(ListViewItem item, bool isNeedLightSomeLabel)
        {
            if (isNeedLightSomeLabel)
                item.BackColor = Color.Blue;
            else
                item.BackColor = Color.White;
        }
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401909
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerP1983,

Task.Factory - точно так?

это кроме using System.Threading; что ещё надо подключить?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401927
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и в этом месте, как я понимаю, (this.Text = "Count: " + Count++;) должна находится вся моя логика?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401937
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) System.Threading.Tasks
2) Нет. DoLongOperation: вытянуть какие-то там значения из БД. DoAfterLongOperation: обновить ui после того, как значения из БД будут вытянуты.
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401942
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3) (this.Text = "Count: " + Count++;) - показатель того, что события по одному разу срабатывают
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401945
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerP1983,

Спасибо большое!
Так причина моей проблемы была в неверном использовании таймера?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38401957
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут вот проблема:
Код: c#
1.
timer1.Tick += selectItems;

. Вы на клик в listView привязывали плюс еще одно событие на Tick таймера.
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402031
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerP1983,

ну да, задумка в этом и была. чтобы после клика, через четверть секунды начался весь процесс обработки нажатия... (но задумывалось чтоб это было 1 раз, а не так как есть) в чём неправильность этого метода?
Я так и не понял, почему же несколько раз обработка шла... Я ведь вырубаю таймер как только вызываю метод с главным алгоритмом...
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402329
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) А если запрос к БД отработает дольше, чем четверть секунды?
2) Зачем придумывать велосипеды, когда все давно придумали за вас?
3) Научитесь пользоваться гуглом. Для начала читать про event, multicastdelegate. Потом про APM, EAP, TAP.
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402352
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
касательно пункта 1.
Я и не расчитывал что за четверть секунды отработает. Я только хотел чтобы сам Item выбирался без тормозов. Поэтому отделил таймером всю логику от обработчика события... чтобы при выборе, сама строка выбралась моментально, а уже после произошла вся логика. но видимо что то не учёл.
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402387
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос: я не понял, вы оставляете костыли с таймером или нет?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402390
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerP1983,

нет нет.я не хочу костыли. я просто хочу понять косяк моей версии
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402398
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и ещё вопрос. если я ставлю
listDrivers.ItemSelectionChanged += ListDriversOnItemSelectionChanged;
то мой обработчик, который я вешал на listDrivers, надо убрать?
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402400
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда может так поймете. Поменяйте 2 метода в вашем примере: перенесите 3 строчки из onChangeIndex в Form1. И все же гляньте про event и multicastdelegate

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        public Form1()
        {
            InitializeComponent();

            timer1.Enabled = false;
            timer1.Interval = 250;
            timer1.Tick += selectItems;
        }

        private void onChangeIndex(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402406
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, надо убрать, а то он срабатывает по 2 раза на одну смену текущего item. Собственно, ItemSelectionChanged тоже срабатывает 2 раза, но можно отследить новый выбранный item по args.IsSelected
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402409
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
J_MnemonicSerP1983,

нет нет.я не хочу костыли. я просто хочу понять косяк моей версии

проблема вашей версии в том что как раз таймер и есть костыль. он здесь вообще неуместен.

используйте асинхронные операции. или Task как описано выше.

в фреймворке 4.5 так вообще красота. с Async/Await
...
Рейтинг: 0 / 0
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
    #38402447
J_Mnemonic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за помощь!
Только я пока не понял, в DoLongOperation мои вытяжки из базы поместить до засыпания потока или после?
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Listview. Событие SelectIndexChanged срабатывает несколько раз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]