Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/41: Рейтинг темы: голосов - 41, средняя оценка - 4.71
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
1

Обращение к DataGridView в другой форме

16.10.2010, 07:34. Показов 8592. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро.
Проблема следующая есть 2 формы в каждой из них есть таблица (разные) одной базы данных. Но в каждой форме обе таблицы имеют номер DataGridView1. Проблема в том что мне при загрузке формы 1 необходимо получить данные таблицы, находящейся в форме 2.
Как это сделать подскажите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2010, 07:34
Ответы с готовыми решениями:

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

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

Обращение к другой форме
Здравствуйте! Помогите пожалуйста разобраться с задачкой. Есть окно Form3, на нем есть 2 кнопки,...

Обращение к объекту в другой форме
Есть 2 формы. Они оба открыты и в одной из них находится textbox в который нужно записать какое...

30
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 12:43 2
Ответы на 7 самых частых вопросов по WinForms

передать ссылку на гридвью через конструктор, напримерили ссылку на дататэйбл этого гридвью
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
16.10.2010, 19:55  [ТС] 3
Чтобы передать данный между двумя формами надо чтобы обе были открыты а я не предполагаю открывать эту форму ни до ни в момент передачи
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 20:11 4
какое-то тут у нас недопонимание.
если у вас форма не создана, то и передавать из нее нечего. как вы все таки мыслите делать эту передачу?

з.ы. если данные глобальные - то наличие форм для передачи необязательно
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
16.10.2010, 20:14  [ТС] 5
Форма создана. Но не открывалась и не предполагает открытие на момент передачи. Либо возможен вариант открытия но в режиме в котором она не будет показываться (если такой есть).
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 20:21 6
кажись поняла.у вас что-то типа загрузки данных в onLoad 2ой формы, но при этом вызвалась она вовсе не из 1ой формы, но данные оттуда взять должна?

если так, то 1)можно сделать источник данных (dataset?) 1ой формы публичным и в любое время обращаться к нему из 2ой формы 2) в каком-то основном методе вашей программы сделать заливку датасетов из бд, а потом уж тиражировать их и в 1, и во 2 формы, через конструкторы или через публичность, как больше нравится
1
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
16.10.2010, 20:33  [ТС] 7
немножко не так но проблема именно такая. А попроще ничего нету ? а то из сказанного я мало понял. Меня устроит загрузка формы 2 при запуске формы 1, лишь бы её не было видно. что-нибудь вместо showDialog есть такое?
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 20:53 8
да тут ничего сложного в общем-то)может,я просто коряво объяснила?

не показывать форму 1, конечно, можно, но зачем?код тогда,наверно, будет выглядеть примерно так:

где-то вы вызываете конструктор 1, он создает форму 1, дальше в этом же конструкторе или по таймеру будет вызван конструтор 2 и ему переданы данные из 1 (лучше в виде dataset или datatable). где-то в любом месте вызываете form1.Hide().

но все равно не могу понять,зачем так делать?может,я чего не понимаю?у вас в форме 1 что-то делается с данными такого, чего нельзя бы было сделать вне ее?она просто получается ненужным посредником.мне кажется, тут как-то надо логику работы с данными пересмотреть может?
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
16.10.2010, 21:07  [ТС] 9
давайте я все подробно разъясню, может я выбрал корявый способ:
Есть "Форма 1" на ней есть comboBox который содержит допустим 3 записи. Этих 3-х записей может быть недостаточно и пользователь захотел добавить четвертую для этого он открывает "форма 2" в которой имеется таблица базы данных которую он поплняет четвертой строкой и сораняет изменения. В результате в comboBox в "Форме 1" становится 4 записи. И надо чтобы в последующие разы, когда он заходит в "Форму 1" в comboBox уже было 4 записи а не 3. Для этого я и хочу чтобы при запуске " Формы 1" происходило считывание базы данных таблицы, подключенной к "форме 2".

Есть ещё 1 корявый сопосб который я рассматриваю из-за своего невежества=) Добавить таблицу БД которая находится в вызываемой "Форме 2" в "Форму 1" и сделать её скрытой чтобы она все время там висела и при запуске программы считывать из неё данные в comboBox.
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 21:31 10
ну тут возможны варианты и различные подходы, конечно

вариант 1:при старте проги слить все инфо в датасет,в разные таблицы. далее в программе уже работать только с датасетом (изменять, добавлять, удалять).а потом при завершении работы занести изменения в базу (не всегда хорошо, т.к. кнопку ресет еще никто не отменял, а изменения нифига не занесутся)
вариант 2: все равно слить данные, т.к. с датасетом хорошо работается, но все важные обновления апдейтить в базу по мере появления
вариант 3: все время работать с базой и дергать только ее

я бы сделана публичный датасет(дататэйбл) с данными.в конструторе 1ой форме делать
C#
1
2
3
4
foreach(то что хотите заносить в комбо, что сейчас в некой таблице датасета)
{ 
      combobox1.items.add(это значение); 
}

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

з.ы. база у вас что ли через студию подключена?не программно?
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
16.10.2010, 21:53  [ТС] 11
Да база подключена через студью, опыта работы никакого с БД нет =) Поэтому что значит сделать публичный датасет не понимаю =) надо почитать.
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 22:17 12
советую просто освоиться в ado.net)лучше подключение к базе самому написать. во-первых, всегда ясно и видно, что где происходит, и всегда сам понимаешь, как управлять подключением.студия, насколько я понимаю, создает компоненты подключения для разных элементов по отдельности. логика в этом есть, но потом теряешься в их количестве.

публичный датасет - это я имею в виду просто сделать его public))

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//где-то объявить (например, в program.cs)
public DataSet ds= new DataSet(); 
 
using (OleDbConnection conn1 = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\;Extended Properties=DBASE IV"))
{
 if (conn1.State == ConnectionState.Closed)
                    {
                        conn1.Open();
                    }
 
                    adapter = new OleDbDataAdapter();
                    adapter.SelectCommand = new OleDbCommand("SELECT * FROM books", conn1);
                    OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
                    conn1.Open();
                    adapter.Fill(ds);
 }
таким образом получаешь слитую табличку в датасете. в датасет можно слить много табличек.а потом делать с ним, что хочется
0
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
16.10.2010, 23:51  [ТС] 13
А разве я не могу напрямую к таблице обратиться? Мне кажется я где-то видел такое. По названию таблицы к нужной ячейке? Таблица то подключена к приложению, а уже в каждой форме я её к разным вьюшкам цепляю.
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
16.10.2010, 23:59 14
хмм.насколько я понимаю, нет. но могу ошибаться.
смотря,что вы имеет в виду.мне кажется, вы немножко путаете суть бд и суть server-эксплорера, который вам облегчает использование базы.
таблица не то чтобы подключена к приложению, а приложение имеет связь с базой. обращение к таблицам происходит,как ни крути, через sql-левые запросы (в частных случаях случаях с sql-поддерживающими базами).

когда вы через студию цепляете базу, она создаст датасет с вашими табличками. скорее всего,это вы и приняли за прямое обращение. что-нибудь типа вашdataset.Tables["Таблица"]
1
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
17.10.2010, 00:32 15
piloterist, тебе действительно следует почитать книгу по ADO.NET. Когда ты будешь знать как все это сделать вручную, ты легко соринтируешься, что тебе делает студия автоматом.


Цитата Сообщение от Terion Посмотреть сообщение
но могу ошибаться
не много ошибаетесь
когда в студии авотматом делается датасет, то в нем создаются копии таблиц БД и к ним можно обращаться как к свойствам датасета (dataSet.MyTable), т.е. как хочет автор "напрямую". Но, все это (датасет, адаптеры, источники) создается в виде экземпляров классов на каждой форме.

Что касательно проблемы , тут все просто.
1) ничего во вторую форму передавать не нужно и обратно ничего получать тоже не нужно.
2) рядом с комбобоксом ставится кнопка на добавление записей и в обработчик пишется в таком стиле:
C#
1
2
3
OrderForm of = new OrderForm();
            if (of.ShowDialog() == DialogResult.OK)
                //тут метод обновления данных();
3) во второй форме создается все необходимое для внесения изменения изменения в БД (dataGridView или что душе угодно)
4)после успешного внесения изменений перед закрытием формы2 следует втыкнуть такую строку this.DialogResult = DialogResult.OK; (я использую это что бы показать что окно успешно выполнило свою функцию)
5)вместо коментария показанного в п.2 ставишь выборку адаптера, который у тебя отвечает за загрузку в comboBox. Как правило он выглядит приблизительно так
C#
1
myTableAdapter.Fill(dataSet.MyTable);
и находится в методе Form_Load
Вот и все
2
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
17.10.2010, 00:36 16
Цитата Сообщение от nio Посмотреть сообщение
не много ошибаетесь
когда в студии авотматом делается датасет, то в нем создаются копии таблиц БД и к ним можно обращаться как к свойствам датасета (dataSet.MyTable), т.е. как хочет автор "напрямую". Но, все это (датасет, адаптеры, источники) создается в виде экземпляров классов на каждой форме.
я про это в самом конце и написала
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
17.10.2010, 01:00 17
Цитата Сообщение от Terion Посмотреть сообщение
я про это в самом конце и написала
не много не про то
Цитата Сообщение от Terion Посмотреть сообщение
вашdataset.Tables["Таблица"]
в данном случае нужно точно знать имя таблицы, и этот способ хорош, когда весь код пишется вручную.

Цитата Сообщение от nio Посмотреть сообщение
dataSet.MyTable
а в этом случае имя таблицы легко вспомнить (или узнать впервые) при помощи IntelliSense, и работает такой способ (насколько мне известно), только если подключение делалось автоматом

поэтому в выше показанном коде нельзя написать вашdataset.Таблица.
1
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
17.10.2010, 01:08 18
да, согласна, немного не про то)
наверняка как-то можно и программно задать такое именное соответствие. надо озадачиться)
1
4 / 4 / 0
Регистрация: 10.10.2009
Сообщений: 301
17.10.2010, 11:33  [ТС] 19
Спасибо большое. Буду пробовать.

Я не много не понял про добавление данных в ComboBox. смысл в том чтобы изначально данные туда попадали без всяких кнопок. А кнопка только при необходимости пополнить выбираемый список.

В принцепи меня устроил бы и способ обращения вашdataset.Tables["Таблица"] т.к. название таблицы и датасета я знаю так как сам их и делаю.
0
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
17.10.2010, 11:34 20
так вы просто вынесите добавление в комбо либо в конструктор формы 1,либо в onload)в отдельную функцию.а когда туда будет приходить новое значение, как предложил nio, опять вызвать эту функцию
0
17.10.2010, 11:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2010, 11:34
Помогаю со студенческими работами здесь

Обращение к элементу на другой форме
Доброго времени суток, Господа. Начинаю работать с C#, помогите решить задачку. есть две формы...

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

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

Обращение к другой форме для ликвидации на ней объекта типа Panel
Здравствуйте! Кто знает, как ликвидировать объект обитаемый на другой форме? К примеру, есть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru