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

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


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

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

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

Код: 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
19.09.2013, 17:43
    #38401909
J_Mnemonic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
SerP1983,

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

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

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

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

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

нет нет.я не хочу костыли. я просто хочу понять косяк моей версии
...
Рейтинг: 0 / 0
20.09.2013, 09:52
    #38402398
J_Mnemonic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
и ещё вопрос. если я ставлю
listDrivers.ItemSelectionChanged += ListDriversOnItemSelectionChanged;
то мой обработчик, который я вешал на listDrivers, надо убрать?
...
Рейтинг: 0 / 0
20.09.2013, 09:53
    #38402400
SerP1983
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
Ну тогда может так поймете. Поменяйте 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
20.09.2013, 09:56
    #38402406
SerP1983
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
Да, надо убрать, а то он срабатывает по 2 раза на одну смену текущего item. Собственно, ItemSelectionChanged тоже срабатывает 2 раза, но можно отследить новый выбранный item по args.IsSelected
...
Рейтинг: 0 / 0
20.09.2013, 09:57
    #38402409
FsShoman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Listview. Событие SelectIndexChanged срабатывает несколько раз
J_MnemonicSerP1983,

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

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

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

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


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