Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767

Передача данных между несколькими класами (ADO)

24.04.2016, 22:55. Показов 1397. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени форумчане. До недавнего времени для передачи данных между формами и классами использовал публичные свойства контролов Owner'a (это между формами) и через метод возвращающий активную форму (на которой так же контролы в публичном доступе). Ну и + (тут я сам знаю что виноват) использовал методы которые меняют объекты (к примеру считывают или записывают в textBox'ы).
На все это мне мягко скажем так указали пальцем.
Итак что же по сути я хочу:
1) код формы должен быть минимален. Это вполне понятно, для переносимости например, если вдруг потом надо будет переписать на wpf к примеру.
2) вся логика в классах (у меня обычно так: есть форма и есть класс с методами для этой формы, к примеру, такие как считать из базы, добавить, редактировать, удалить)
3)все контролы форм должны быть в приватном режиме.
Из тех способов что я знаю, делегаты, owner, конструктор формы, не подойдут так как по п3 не проходят. Хотя и owner'a и через конструктор формы я тоже использую кое какие вещи. Остается создать класс с публичными свойства и использовать его.
я накидал простое приложение для добавления\редактирования\удаление\выбор ки данных через 2ю форму показывающую все это.

приложение простое всего 2 формы.
код главной формы на которой располагается грид с данными:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
 
namespace TestDB
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
        }
 
        ClassesForm.mainFormClass mainClass = new ClassesForm.mainFormClass();
        public bool isEdit = false; //флаг открытия формы editForm для редактирования
        private void mainForm_Load(object sender, EventArgs e)
        {
            mainClass.select(_bsMain);
        }
 
        private void _btnAdd_Click(object sender, EventArgs e)
        {
            editForm edit = new editForm(_bsMain);
            edit.ShowDialog(this);
        }
 
        private void _btnEdit_Click(object sender, EventArgs e)
        {
            if (_dgvMain.RowCount != 0)
            {
                if (_dgvMain.CurrentRow.Index != -1)
                {
                    isEdit = true;
                    editForm editFrm = new editForm(_bsMain);
                    editFrm.ShowDialog(this);
                    isEdit = false;
                }
            }
            else
            {
                MessageBox.Show("Не выбрана запись для редактирования.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
        }
 
        private void _btnDel_Click(object sender, EventArgs e)
        {
            Classes.dataFormsClass.mainFormData mainFormData = new Classes.dataFormsClass.mainFormData();
 
            if (_dgvMain.RowCount != 0)
            {
                if (_dgvMain.CurrentRow.Index != -1)
                {
                    DialogResult result = MessageBox.Show("Вы действительно хотите удалить текущую запись ?", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        mainFormData.id = (int)_dgvMain.CurrentRow.Cells[_col_id.Index].Value;
                        mainClass.delete(mainFormData);
                        mainClass.select(_bsMain);
                    }
                    else
                        return;
                }
            }
            else
            {
                MessageBox.Show("Не выбрана запись для удаления. Пожалуйста выберите запись.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
        }
 
        /// <метод через который мы будем подгружать данные грида в класс
        /// для того чтобы подчиненная форма могла использовать эти данные>
        /// в пртивном случае в подчиненной форме придется инициализирвать класс mainFormData,
        /// а это уже не те данные
        /// </summary>
        /// <returns></returns>
        public Classes.dataFormsClass.mainFormData getMainFormData()
        {
            Classes.dataFormsClass.mainFormData data = new Classes.dataFormsClass.mainFormData();
            data.id = (int)_dgvMain.CurrentRow.Cells[_col_id.Index].Value;
            data.surname = _dgvMain.CurrentRow.Cells[_col_surname.Index].Value.ToString();
            data.name = _dgvMain.CurrentRow.Cells[_col_name.Index].Value.ToString();
            data.last_name = _dgvMain.CurrentRow.Cells[_col_last_name.Index].Value.ToString();
            data.city = _dgvMain.CurrentRow.Cells[_col_city.Index].Value.ToString();
            data.street = _dgvMain.CurrentRow.Cells[_col_street.Index].Value.ToString();
            data.nom_house = _dgvMain.CurrentRow.Cells[_col_nom_house.Index].Value.ToString();
            return data;
        }
    }
}
код 2й формы для редактирования данных:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace TestDB
{
    public partial class editForm : Form
    {
        public editForm(BindingSource bsOwner)
        {
            InitializeComponent();
            bs = bsOwner;
        }
 
        BindingSource bs;
        ClassesForm.mainFormClass mainClass = new ClassesForm.mainFormClass();
 
        private void editForm_Load(object sender, EventArgs e)
        {
            mainForm mainFrm = (mainForm)Owner;
            if (mainFrm.isEdit)
            {
                _txt_surname.Text = mainFrm.getMainFormData().surname; ;
                _txt_name.Text = mainFrm.getMainFormData().name;
                _txt_last_name.Text = mainFrm.getMainFormData().last_name;
                _txt_city.Text = mainFrm.getMainFormData().city;
                _txt_street.Text = mainFrm.getMainFormData().street;
                _txt_nom_house.Text = mainFrm.getMainFormData().nom_house;
            }
        }
 
        private void _btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        private void _btnSave_Click(object sender, EventArgs e)
        {
            mainForm mainFrm = (mainForm)Owner;
            if (!mainFrm.isEdit)
            {
                Classes.dataFormsClass.mainFormData dataInsert = new Classes.dataFormsClass.mainFormData();
                dataInsert.surname = _txt_surname.Text;
                dataInsert.name = _txt_name.Text;
                dataInsert.last_name = _txt_last_name.Text;
                dataInsert.city = _txt_city.Text;
                dataInsert.street = _txt_street.Text;
                dataInsert.nom_house = _txt_nom_house.Text;
 
                mainClass.insert(dataInsert);
                mainClass.select(bs);
                this.Close();
            }
            else
            {
                Classes.dataFormsClass.mainFormData dataUpdate = new Classes.dataFormsClass.mainFormData();
                dataUpdate.surname = _txt_surname.Text;
                dataUpdate.name = _txt_name.Text;
                dataUpdate.last_name = _txt_last_name.Text;
                dataUpdate.city = _txt_city.Text;
                dataUpdate.street = _txt_street.Text;
                dataUpdate.nom_house = _txt_nom_house.Text;
                dataUpdate.id = mainFrm.getMainFormData().id;
 
                mainClass.update(dataUpdate);
                mainClass.select(bs);
                this.Close();
            }
        }
и теперь самое интересное это классы:
класс содержащий методы для этих форм (выборка\вставка\редактирование\удаление больше мне в принципе ничего не надо тут)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;
 
namespace TestDB.ClassesForm
{
    class mainFormClass
    {
        Classes.dbWorkClass workDb = new Classes.dbWorkClass();
 
 
        /// <показать все записи в таблицу>
        /// тут мы будем заполнять bs и по ссылке отправлять его назад в главную форму для
        /// отображения данных в гриде
        /// </summary>
        public void select(BindingSource bs)
        {
            OleDbCommand commandSelect = new OleDbCommand(Classes.SqlQueryClass.select);
            bs.DataSource = workDb.SqlHandler(commandSelect, true);
        }
 
        /// <добавить новую запись>
        /// 
        /// </summary>
        public void insert(Classes.dataFormsClass.mainFormData mainData)
        {
            OleDbCommand commandInsert = new OleDbCommand(Classes.SqlQueryClass.insert);
            commandInsert.Parameters.Add("@surname", OleDbType.VarChar).Value = mainData.surname;
            commandInsert.Parameters.Add("@name", OleDbType.VarChar).Value = mainData.name;
            commandInsert.Parameters.Add("@last_name", OleDbType.VarChar).Value = mainData.last_name;
            commandInsert.Parameters.Add("@city", OleDbType.VarChar).Value = mainData.city;
            commandInsert.Parameters.Add("@street", OleDbType.VarChar).Value = mainData.street;
            commandInsert.Parameters.Add("@nom_house", OleDbType.VarChar).Value = mainData.nom_house;
 
            if ((bool)workDb.SqlHandler(commandInsert, false))
            {
                MessageBox.Show("Данные успешно сохранены.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
 
        /// <обновить текущую запись>
        /// 
        /// </summary>
        public void update(Classes.dataFormsClass.mainFormData mainData)
        {
            OleDbCommand commandUpdate = new OleDbCommand(Classes.SqlQueryClass.update);
            commandUpdate.Parameters.Add("@surname", OleDbType.VarChar).Value = mainData.surname;
            commandUpdate.Parameters.Add("@name", OleDbType.VarChar).Value = mainData.name;
            commandUpdate.Parameters.Add("@last_name", OleDbType.VarChar).Value = mainData.last_name;
            commandUpdate.Parameters.Add("@city", OleDbType.VarChar).Value = mainData.city;
            commandUpdate.Parameters.Add("@street", OleDbType.VarChar).Value = mainData.street;
            commandUpdate.Parameters.Add("@nom_house", OleDbType.VarChar).Value = mainData.nom_house;
            commandUpdate.Parameters.Add("@id", OleDbType.Integer).Value = mainData.id;
 
            if ((bool)workDb.SqlHandler(commandUpdate, false))
            {
                MessageBox.Show("Данные успешно обновлены.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
 
        /// <удалить текущую запись>
        /// 
        /// </summary>
        public void delete(Classes.dataFormsClass.mainFormData mainData)
        {
            OleDbCommand commandDel = new OleDbCommand(Classes.SqlQueryClass.delete);
            commandDel.Parameters.Add("@id", OleDbType.Integer).Value = mainData.id;
 
            if ((bool)workDb.SqlHandler(commandDel, false))
            {
                MessageBox.Show("Запись успешно удалена.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}
и собственно класс через который мы обмениваемся данными с классами и формами:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace TestDB.Classes
{
    public class dataFormsClass
    {
        public class mainFormData
        {
            private int _id;
            private string _surname;
            private string _name;
            private string _last_name;
            private string _city;
            private string _street;
            private string _nom_house;
 
            public int id
            {
                get {return _id;}
                set {_id = value;}
            }
            public string surname
            {
                get {return _surname;}
                set {_surname = value;}
            }
            public string name
            {
                get { return _name; }
                set { _name = value; }
            }
            public string last_name
            {
                get { return _last_name; }
                set { _last_name = value; }
            }
            public string city
            {
                get { return _city; }
                set { _city = value; }
            }
            public string street
            {
                get { return _street; }
                set { _street = value; }
            }
            public string nom_house
            {
                get { return _nom_house; }
                set { _nom_house = value; }
            }
        }
    }
}
Для тех кто захочет посмотреть полностью вот само приложение:
TestDB.rar
И собственно что меня интересует. А интересует меня мнение опытных ребят, на сколько такой подход хороший или плохой, если другой способ ? Возможно дополнительный класс только хуже и т.д. Вообщем я буду благодарен за любые ваши мнения.
PS Тольлько для ADO.NET. с ORM все подругому.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2016, 22:55
Ответы с готовыми решениями:

Передача данных на удаленный сервер по TCP несколькими потоками
День добрый! Подскажите как лучше сделать, нкжно передавать данные на удалённый сервер по TCP, в один поток всё работает, вопрос как...

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

Передача данных между ПК по интернету
сабж, сколько исходников не перекопал, все на моем компе работают, а между двумя не хотят. Что я неправильно делаю? Вот например нашёл...

6
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.04.2016, 23:31
Цитата Сообщение от wm_leviathan Посмотреть сообщение
Остается создать класс с публичными свойства и использовать его.
wm_leviathan, вы вроде не новичок, однако я не увидел в вашем классе самого главного (и наиболее, на мой взгляд, удобного) способа - через события.
1
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
25.04.2016, 12:25  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
вы вроде не новичок
ну все мы так или иначе новички или старички относительно кого то
Спасибо большое за ответ, я смотрел ваш пример сделанный через события описанный в "7 часто задаваемых вопросов". Но почему на ваш взгляд это самый удобный способ ? Разве злоупотребление событиями и делегатами не приводит в конце концов к жутким тормозам приложения, как пример это AutoCad 9 написанный полностью на событиях. И если необходимо настроить двустороннюю связь между несколькими классами мне же придется описывать события на всех классах, что в свою очередь захламляет немного код. Но в некоторых случаях безусловно события нужны и весьма полезны и очень хорошо дополняют свойства. Хотелось бы если можно по подробнее )))
что касается моего примера то переделал публичный метод в форме в публичное свойство думаю так даже правильнее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public DataModel.Forms.mainFormData getCurrentData
        {
            get
            {
                var data =             new DataModel.Forms.mainFormData();
                data.id =               (int)_dgvMain.CurrentRow.Cells[_col_id.Index].Value;
                data.surname =       _dgvMain.CurrentRow.Cells[_col_surname.Index].Value.ToString();
                data.name =           _dgvMain.CurrentRow.Cells[_col_name.Index].Value.ToString();
                data.last_name =     _dgvMain.CurrentRow.Cells[_col_last_name.Index].Value.ToString();
                data.city =              _dgvMain.CurrentRow.Cells[_col_city.Index].Value.ToString();
                data.street =           _dgvMain.CurrentRow.Cells[_col_street.Index].Value.ToString();
                data.nom_house =    _dgvMain.CurrentRow.Cells[_col_nom_house.Index].Value.ToString();
                return data;
            }
            
        }
+ подкорректировал немного код во всем приложении, TestDB.rar
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.04.2016, 12:48
wm_leviathan, на мой взгляд, есть одна существенная разница между использованием свойств и событий: при использовании свойств внешнему коду приходится запрашивать состояние объекта. Но что, если мы не знаем, когда состояние объекта измениться, и нам нужно именно в этот момент и узнать об изменении? Не будем же мы по таймеру постоянно дергать наш объект. И вот тут и помогут события. Мы просто подписываемся на них и спокойно сидим ждем, когда что-то произойдет. Как только произошло - мы тут же получили уведомление об этом. Кстати, события и свойство можно и совместить (если не хочется писать свой класс для аргумента события). Делаем событие, как произошло - опрашиваем наш объект и получаем актуальные значения свойств. Короче говоря, все хорошо в меру, всему свое время и место.

Добавлено через 15 минут
wm_leviathan, сейчас глянул ваш скрин, ну в принципе там у вас все просто. Сейчас минут за 30-40 накидаю, как бы я это сделал. Конечно, не скажу что мой код будет идеален, в конце концов у всех свой стиль. Посмотрите.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.04.2016, 18:07
Лучший ответ Сообщение было отмечено wm_leviathan как решение

Решение

wm_leviathan, извиняюсь за задержку, загрузили работой.
В архиве мой пример, сделал по подобию вашего скриншота. В данном случае не требуется никаких особых заморочек, таких как свойства, события и так далее. Просто передаем пару параметров в одну форму из другой и все. Комментариев там не много, я просто не успел. Основной класс работы с БД я прокомментировал, а интерфейс - думаю и так разберетесь. Будет что непонятно-спросите.
Вложения
Тип файла: rar DatabaseDemo.rar (522.3 Кб, 24 просмотров)
2
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
26.04.2016, 12:48  [ТС]
insite2012, огромное спасибо за пример, понравилась его реализация.
Цитата Сообщение от insite2012 Посмотреть сообщение
Комментариев там не много
весь код и так хорошо читабелен
модели я примерно так же реализовывал а вот доступ к ним, да немного по другому.
Интересная реализация через пару Dictionary<OperationType, string> сразу напомнила мне EF )))
C#
1
2
3
            btnDelete.Click += new EventHandler(OperateUser_Click);
            btnInsert.Click += new EventHandler(OperateUser_Click);
            btnUpdate.Click += new EventHandler(OperateUser_Click);
судя по всему ваша любовь к событиям. В целом да, пример через модель данных. Кое что интересное почерпнул для себя. Буду расковыривать его дальше, большое спасибо. Просто хочется сделать как то хотя бы приблизительно к EF.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.04.2016, 14:20
Цитата Сообщение от wm_leviathan Посмотреть сообщение
понравилась его реализация.
Ну я стараюсь, для меня красота кода тоже играет значение.
Цитата Сообщение от wm_leviathan Посмотреть сообщение
судя по всему ваша любовь к событиям.
Как правило, я всегда обработчики пишу руками, чтобы сразу в коде видеть, что у меня к чему подключено.
Цитата Сообщение от wm_leviathan Посмотреть сообщение
большое спасибо.
На здоровье, если что-обращайтесь.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2016, 14:20
Помогаю со студенческими работами здесь

Передача данных между программами
Здравствуйте. Нужно написать приложение на C# выполняющее передачу данных между Microsoft Office и Opera (передача web страниц данных) за...

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

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

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

Передача данных между сеансами удаленного рабочего стола
Коллеги, подскажите пожалуйста, как лучше всего решить данную задачу. У меня две программы, обе написанных на C#. Хочу организовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru