Member 13581008 Ответов: 1

Автоматическое обновление gridview в windows с


First I am new to building windows forms and a novice script writer (youtube taught) so please bear with me. I have created a windows form in Visual Studio that allows the user to add, modify and delete data in a sql table and it displays these changes in a gridview that is attached to the windows form. I am able to display the changes to the sql table instantly from the form I made the changes to, the problem is if multiple users have the form open they do not see the changes until they either make a change themselves or close and reopen the form. I am looking for a way so if one person makes a change, all users that have the form open will also see the change automatically without having to manual refresh the screen. I found a tool in Visual Studio for timer that appears to work by refreshing the gridview x amount of seconds. I tried to attach this to my gridview but get an error "No overload for 'timer_Tick' matches delegate 'EventHandler'". First is this the way to go or should I use something else to auto refresh the gridview? If it is what am I doing wrong.

Что я уже пробовал:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
       {
           Timer timer = new Timer();
           timer.Interval = (10 * 1000); // 10 secs
           timer.Tick += new EventHandler(timer_Tick);
           timer.Start();
       }

       private void timer_Tick(object sender, DataGridViewCellEventArgs e)
       {
           //refresh here...
       }

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Вау. С чего начать?..

Во-первых, вы создаете новый таймер для каждого щелчка по ячейке. ЭТО ДЕЙСТВИТЕЛЬНО ПЛОХО! Таймеры-это конечный ресурс в Windows, и вы не уничтожаете те, которые создаете, поэтому в конечном итоге у вас будут работать десятки таймеров, все они делают одно и то же!

Использование таймера все еще возможно, если и только если пользователь не получает возможности сделать какое-либо редактирование в сетке, которую вы пытаетесь обновить. Обновление его во время редактирования отменит редактирование пользователей, прямо в середине их выполнения.

Но использование таймера для обновления чего-то из базы данных имеет и обратную сторону-масштабируемость. Чем больше клиентов вы обновите по таймеру, тем больше запросов попадет в базу данных. Это приведет к тому, что клиенты просто наводнят базу данных запросами на одни и те же данные.

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

Чтобы решить эту проблему, вам придется использовать пейджинговый или виртуальный режим в сетке. Это все усложняет.

Во-вторых, посмотрите на подпись обработчика событий timer_Tick, который вы пытаетесь подключить:

private void timer_Tick(object sender, DataGridViewCellEventArgs e)

Аргументы события для события элемента управления datagridview, не для события Tick таймера. Вот почему вы получаете исключение, которым вы являетесь. Событие Timer Tick просто использует общий аргумент EventArgs:
private void timer_Tick(object sender, EventArgs e)


Чтобы использовать таймер, вы должны поместить его в форму и дважды щелкнуть по нему, чтобы запустить обработчик событий для вас. Сделайте поиск данных в базе данных и обновление сетки оттуда. Запустите таймер, когда ваша форма будет показана, и вы закончите. Нет необходимости создавать новый таймер для каждого щелчка по ячейке.

Есть и другие варианты использования таймера, но код становится все более и более сложным, например, использование уведомлений SQL Server (старых), серверных компонентов, кэширования и подписок, служб, бла-бла - бла ... ничего особенного для "новой для этого" толпы.


Member 13581008

Спасибо за информацию. Я не прикрепляю таймер к каждому щелчку. Мне просто нужно обновить сетку. Итак, если вы не рекомендуете использовать таймер, можете ли вы указать мне, что я должен использовать?

Кроме того, я попробовал вашу рекомендацию по таймеру. Я прикрепил его к форме и отрегулировал настройку, а gridview по-прежнему не обновляется автоматически.

Dave Kreskowiak

Ваш код обновления должен выполнить запрос, чтобы получить все, что он отображает, а затем повторно привязать сетку к данным. Вы не показали код, который запускает таймер, ни код в обработчике тиков таймера, ни код, который выполняет извлечение и повторную привязку к сетке. Без этого никто не может сказать вам, что не так.

Другие методы удаляют большой объем работы для реализации, как в вашем приложении, так и на стороне SQL server. Я не могу ничего рекомендовать, потому что я ничего не знаю о вашем приложении, ваших требованиях, объеме данных, которые вы отображаете, количестве данных, с которыми вы работаете, частоте обновлений, вашем уровне квалификации ... ничего.

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