Все операции с БД в графическом приложении в C#

Вопрос задан
6 лет 9 месяцев назад

Просмотрен
2k раз

У меня 3 вопроса:

  • Можно ли создать таблицу в WinForms отличную от DataGridView (другим
    способом, т.к. там нет возможности устанавливать количество строк)?
  • Допустим, для примера, я добавил в форму DataGridView1. Как с
    помощью кнопки уже в самой программе можно добавлять ещё несколько
    таких же таблиц с теми же свойствами?
  • Допустим, я в нескольких таблицах ввёл какие-то числа. Как сделать,
    чтобы одинаковые числа в разных таблицах выделялись другим цветом,
    или выделялись ячейки таблицы, в которых находятся похожие числа?

Все операции с БД в графическом приложении в C#

задан 18 окт 2015 в 6:20

Вот рабочий пример приложения.

В примере данные в список заносятся вручную. Вы должны сделать загрузку из БД. Как именно — решать вам. Это может быть сырой ADO. NET (вручную написанные sql-запросы с использованием SqlDataReader), или SqlDataAdapter + DataTable, или ORM типа EntityFramework.

Так как используется привязка данных (data binding) то применяем BindingList — при этом будут работать события добавления/удаления элементов в коллекции.

После того, как данные загружены и привязаны к датагриду, создаём и помещаем в него колонки типа DataGridViewButtonColumn. Для обработки нажатий на них используется обработчик события CellContentClick.

Последнее обновление: 31. 2015

Элемент TableLayoutPanel также переопределяет панель и располагает дочерние элементы управления в виде таблицы, где для каждого
элемента имеется своя ячейка. Если нам хочется поместить в ячейку более одного элемента, то в эту ячейку добавляется другой компонент
TableLayoutPanel, в который затем вкладываются другие элементы.

Чтобы установить нужное число строки столбцов таблицы, мы можем использовать свойства Rows и Columns соответственно. Выбрав один из этих пунктов в
окне Properties (Свойства), нам отобразится следующее окно для настройки столбцов и строк:

Все операции с БД в графическом приложении в C#

В поле Size Type мы можем указать размер столбцов / строк. Нам доступны три возможные варианта:

  • Absolute: задается абсолютный размер для строк или столбцов в пикселях
  • Percent: задается относительный размер в процентах. Если нам надо создать резиновый дизайн формы, чтобы ее строки и столбцы, а также
    элементы управления в ячейках таблицы автоматически масштабировались при изменении размеров формы, то нам нужно использовать именно эту опцию
  • AutoSize: высота строк и ширина столбцов задается автоматически в зависимости от размера самой большой в строке
    или столбце ячейки

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

В этом диалоговом окне мы также можем добавить или удалить строки и столбцы. В тоже время графический дизайнер в Visual Studio не всегда сразу отображает
изменения в таблице — добавление или удаление строк и столбцов, изменение их размеров, поэтому, если изменений на форме никаких не происходит, надо ее закрыть и потом
открыть заново в графическом дизайнере.

Итак, например, у меня имеется три столбца и три строки размер у которых одинаков — 33. 33%. В каждую ячейку таблицы добавлена кнопка, у которой установлено свойство
Dock=Fill.

Все операции с БД в графическом приложении в C#

Если я изменю размеры формы, то автоматически масштабируются и строки и столбцы вместе с заключенными в них кнопками:

Все операции с БД в графическом приложении в C#

Что довольно удобно для создания масштабируемых интерфейсов.

В коде динамически мы можем изменять значения столбцов и строк. Причем все столбцы представлены типом ColumnStyle,
а строки — типом RowStyle:

Для установки размера в ColumnStyle и RowStyle определено свойство SizeType, которое принимает одно из значений одноименного перечисления
SizeType

Добавление элемента в контейнер TableLayoutPanel имеет свои особенности. Мы можем добавить его как в следующую свободную ячейку или можем явным
образом указать ячейку таблицы:

Button saveButton = new Button();
// добавляем кнопку в следующую свободную ячейку
tableLayoutPanel1. Controls. Add(saveButton);
// добавляем кнопку в ячейку (2,2)
tableLayoutPanel1. Controls. Add(saveButton, 2, 2);

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

Основы форм

Внешний вид приложения является нам преимущественно через формы. Формы являются основными строительными блоками. Они предоставляют
контейнер для различных элементов управления. А механизм событий позволяет элементам формы отзываться на ввод пользователя, и, таким образом,
взаимодействовать с пользователем.

При открытии проекта в Visual Studio в графическом редакторе мы можем увидеть визуальную часть формы — ту часть, которую мы видим после запуска приложения и куда мы переносим
элементы с панели управления. Но на самом деле форма скрывает мощный функционал, состоящий из методов, свойств, событий и прочее. Рассмотрим
основные свойства форм.

Если мы запустим приложение, то нам отобразится одна пустая форма. Однако даже такой простой проект с пустой формой имеет несколько компонентов:

Все операции с БД в графическом приложении в C#

Несмотря на то, что мы видим только форму, но стартовой точкой входа в графическое приложение является класс Program, расположенный в
файле Program. cs:

Сначала программой запускается данный класс, затем с помощью выражения Application. Run(new Form1()) он запускает форму
Form1. Если вдруг мы захотим изменить стартовую форму в приложении на какую-нибудь другую, то нам надо изменить в этом выражении Form1 на соответствующий
класс формы.

Сама форма сложна по содержанию. Она делится на ряд компонентов. Так, в структуре проекта есть файл Form1. Designer. cs, который выглядит
примерно так:

Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose(), который выполняет роль деструктора объекта, и
InitializeComponent(), который устанавливает начальные значения свойств формы.

При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.

Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции — установка свойств объектов, установка переменных.

Еще один файл — Form1. resx — хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для
нескольких языковых культур.

И более важный файл — Form1. cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы:

По умолчанию здесь есть только конструктор формы, в котором просто вызывается метод InitializeComponent(), объявленный в файле дизайнера
Form1. Designer. Именно с этим файлом мы и будем больше работать.

Сегодня я решил написать Вам о том, как работать с элементом управления DataGridView в языке программирования C#. DataGridView — очень мощный инструмент для работы с данными. Он очень гибок и позволяет автоматизировать вывод информации. Я постараюсь рассказать Вам о базовой работе с данным элементом, а так же привести пример автоматизации обновления данных в таблице.

Для тех, кто не знает о элементе управления DataGridView — скажу что данный контрол позволяет вывести таблицу с данными в Вашей программе. Данный элемент управления имеет огромное число настроек. Благодаря этому Вы скорей всего сможете подстроить внешний вид таблицы так, как Вам нужно. Все настройки доступны в панели свойств элемента в Visual Studio. Я буду задавать свойства нашего элемента пряма в коде, для большей наглядности.

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

В целом это и есть базовая работа с элементом DataGridView. По сути мы имеем работу с матрицей (двумерным массивом). Давайте теперь рассмотрим базовый вариант автоматизации обновления данных в таблице — механизм привязки (Binding). Для этого создадим класс, который будет играть роль одной строки. по сути нам нужно создать класс, описывающий колонки нашей таблицы.

Теперь мы можем написать следующий код в событии формы OnLoad:

There is ALWAYS a way to get it to work. It may not be obvious from the WinForms designer, but it is not too hard.

The key to get this to work is this line:

this. tableLayoutPanel1. SetRowSpan(this. panel1, 3);//This line is the key!!!!!

Заполняем таблицу DataGridView из кода и обрабатываем событие CellFormatting

Предыдущая заметка по работе с таблицами DataGridView в среде Visual Studio (VS 2015, C++/CLI) находится вот здесь. А в этой статье мы покажем, как можно формировать таблицы построчно и наиболее простым способом «заставлять» пользователя соблюдать формат столбцов при вводе — заменяя величину в ячейке на значение по умолчанию, если введено что-то не то.

Проект Windows Forms создан как обычно, в верхнюю часть формы перетащим контейнер Panel установим ему привязку Dock = Top, а положение Location = 0; 0.

На панели разместим 2 кнопки размером Size = 32; 32 которые получат наименования button1, button2, изобразим на них подписи (свойство Text) «+» и «-» (добавление и удаление записи).

Ниже панели добавим табличный элемент данных DataGridView, установим у него свойство Dock = Fill. Все остальные свойства таблицы настроим программно, удобнее написать для этой цели отдельный метод, который вызовется из обработчика события Load формы, вот обе функции:

Кроме того, функция MyForm_Load показывает, как добавить в таблицу «предустановленные» записи, сохранённые в массиве строк.

Кнопке 1 останется просто добавить пустую запись:

Кнопка 2 реализует короткий код для удаления выделенной строки, если таковая есть:

Наконец, для настройки и проверки «на лету» формата данных в столбцах таблицы напишем обработчик её события CellFormatting.

Мы не будем мучить пользователя всплывающими сообщениями, а просто станем заменять «неправильные» числа на значения по умолчанию.

Покажем для примера обработку столбцов «Id» (идентификатор, целое число), «Дата» (вида ДД. ГГГГ) и «Стоимость» (вещественные числа с 2 знаками в дробной части), другие типы данных можно обработать по аналогии.

Мы не требуем обязательной уникальности значений в столбце id, их можно обновлять, например, при программном заполнении столбца «только для чтения» Итого.

Этот маленький метод будет просто обрабатывать событие DataError:

Вот что получилось:

скриншот этого примера

Можно подойти к задаче проверки корректности ввода в ячейки DataGridView и по-другому — создать ячейку-образец (тип DataGridViewCell), настроить ей свойство стиля Style и установить в качестве шаблона (свойство CellTemplate) для отдельно созданного столбца (тип DataGridViewColumn).

Многие полезные свойства можно указать и непосредственно для столбца, например «только чтение» (ReadOnly), ограничение на тип вводимой величины (ValueType) и т.

Ниже показана изменённая функция setupDataGridView, иллюстрирующая этот подход. Кроме того, для перехвата ошибок ввода данных следует написать обработчик события DataError для нашего DataGridView и, конечно, изменить метод button1_Click, так как показанный в примере столбец таблицы — единственный в ней.

Доброго времени суток!

В данной статье я опишу создания своих элементов для C# Windows Form.

Для примера буду создавать таблицу со всем функционалом DataGridView. Позже перейдем на свои элементы. Создание первого элемента разобьем на несколько уроков. В данном уроке произведем от рисовку таблицы, а также: создание столбцов, строк, ячеек.

Для написания будем использовать. Net FrameWork 4. x, среда разработки Visual Studio 2019.

В первую очередь создадим обычный проект Windows Form. Думаю не нужно это показывать. А уже потом создаем проект «Библиотека элементов управления Windows Form»(Назовем его CustomControl).

Далее в этом же файле создадим еще несколько классов, а именно:Column,Row,Cell. Рассмотрим каждый по отдельности. Начнем с Column:

Класс Cell(Для поддержки копирования добавляем интерфейс ICloneable):

Теперь настроим наш основной класс TableCustoms:

Для того, чтобы у нас были полосы прокрутки нужно использовать ScrollableControl, поэтому создадим класс PanelTable наследуем ScrollableControl и помещаем его на Control(в следующем уроке объясню почему создаем два разных контрола, а не используем сразу ScrollableControl):

После этого «Пересобираем проект» элемента и добавляем элемент на форму(в основном проекте):

Все операции с БД в графическом приложении в C#

Теперь проверим некоторые методы нашего элемента:

Запускаем наш проект:

Все операции с БД в графическом приложении в C#

Все операции с БД в графическом приложении

Ранее мы рассмотрели, как удобно загружать данные в приложении Windows Forms в элемент DataGridView через DataSet. Теперь определим полнофункциональную
форму, через которую мы сможем производить все стандартные CRUD операции в базе данных.

Итак, определим форму, на которой будет элемент DataGridView и три кнопки для добавления, удаления и сохранения изменений. Форма в итоге будет
выглядеть примерно следующим образом:

Все операции с БД в графическом приложении в C#

Код формы будет выглядеть следующим образом:

В конструкторе данные загружаются в DataSet, первая таблица которого устанавливается в качестве источника данных для dataGridView1:

Также в конструкторе устанавливается полное выделение строки и запрет на ручное добавление новых строк:

В обработчике кнопки добавления создается новая строка, которая добавляется в таблицу объекта DataSet. И так как мы ранее установили
привязку к источнику данных, то автоматически новая строка также будет добавляться и в dataGridView1:

В обработчике кнопки удаления удаляются выделенные строки в dataGridView1. Опять же в силу привязки к источнику данных будет также происходить удаление
и из таблицы в DataSet:

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

Как в прошлой теме здесь устанавливается у адаптера команда на добавление InsertCommand и затем вызывается метод Update(). В итоге мы можем добавить несколько строк, удалить, изменить, и потом один раз мы нажмем на кнопку, и все изменения будут применены к базе данных.