1

Доброго времени суток, Господа. Суть вопроса заключается в следующем: Есть джентельменский набор отображение данных таблицы из базы данных: DataGridView, BindingSource, DataSet, TableAdapter. Есть также кнопка "удалить", которая выполняет удаление строки из базы данных. Все работает отлично. Мне нужно сделать так, чтобы когда данных в таблице не было, то эта кнопка была заблокирована. Тоесть блокировать эту кнопку нужно в том случае, если при загрузки формы данных в таблице нет, или если мы удалили последнюю строку с базы данных. Все мы не любим костылей, и повторного кода, поэтому тупо писать условие в обработчике загрузки формы и обработчике нажатия на кнопку, я считаю глупо. Я думаю, что есть какое-то событие, то ли у BindingSource, то ли у DataSet, или еще где-нибудь, которое реагирует на обновление данных таблицы.

Нашел такое событие у BindingSource - ListChanged. Оно мне не подходит по двум причинам:

  1. Оно скорее всего реагирует не на то, что мне конкретно надо, так как смотрю в дебаггере, на это событие раз по 10 при загрузке формы(обновления таблицы) приходит. Бред короче.
  2. Если создам textBox, который будет являться поиском по таблице, соответственное в обработчике TextChanged установлю Filter по выборке BindSource. Так вот, когда я начинаю вводить текст в TextBox, то соответственно устанавливается новый фильтр в BindingSource, а это в свою очередь вызывает ListChanged, а он в свою очередь разблокирует кнопку, которая должна быть заблокирована в данное время.

Надеюсь понятно все объяснил:) Помогите пожалуйста:)

Ruslan_K
  • 4,599
  • 2
  • 15
  • 29
Bretbas
  • 402
  • Это неправильный набор. При таком наборе обращение к таблице происходит в UI-потоке. Вытесните таблицу в (асинхронную) модель. – VladD Jan 21 '17 at 19:57
  • Что это значит? Я Вас не очень понял – Bretbas Jan 21 '17 at 20:01
  • Ну, у вас ведь обращение к таблице происходит в UI-потоке, да? У вас наверняка вовсе нет фоновых потоков в приложении. – VladD Jan 21 '17 at 21:11
  • Нет фоновых потоков. Я C# не очень хорошо знаю. Больше по C++. Просто попросили написать программку на C# – Bretbas Jan 21 '17 at 21:26
  • Ну вот. А читать базу данных необходимо в фоновом потоке. Иначе если база будет большая, ваша программа будет подвисать. (И вы будете ругать Microsoft, а не себя.) – VladD Jan 21 '17 at 22:12
  • Хорошо. Если я читать базу буду в другом потоке, то что я буду делать в основном? И что по поводу моего вопроса?:) – Bretbas Jan 21 '17 at 22:16
  • Что делать в основном — отрисовывать UI. Вот вам образец программы: http://ru.stackoverflow.com/a/616413/10105. А по поводу вашего вопроса не знаю, я никогда не пользовался DataSet'ом, а всегда читал в List<Entity> и отображал его. – VladD Jan 21 '17 at 22:18
  • @FoggyFinder: Да, это лишь пример того, как организовывать взаимодействие между моделью и VM/контроллером. Конкретный фреймворк тут не при чём. – VladD Jan 22 '17 at 10:16
  • Я новичок только в C#. В C++ организовывал MVC на потоках. Но мне не очень хочется погружаться в дебри C#. Мне нужно просто быстро написать программу, и быстренько закрыть этот вонючий C# код:) – Bretbas Jan 23 '17 at 05:57

0 Answers0