Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление dataGridView после запроса 
:(
    Опции темы
Ald
Дата 4.8.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 31.7.2008

Репутация: нет
Всего: нет



Здравствуйте. Есть 2 формы. На 1 – ой форме расположен dataGridView1 и кнопка при нажатии которой открывается вторая форма. На 2 – ой расположен textBox1 и 2 кнопки, Ок и Cancel.  При нажатии кнопки Ок данные из textBox1 заносятся в БД.
 Как потом обновить записи в dataGridView1, после нажатия кнопки Ок, чтобы после добавления записи она сразу была бы видна в dataGridView1?

Код

public partial class Form1 : Form
    {
        private string sqlConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=c:\test.mdf;" +
                "Integrated security=SSPI;";
        public Form1()
        {
            InitializeComponent();
            
            string sqlSelect = "SELECT * FROM TestTable";
            SqlDataAdapter da = new SqlDataAdapter(sqlSelect, sqlConnectString);
            DataSet ds = new DataSet();
            da.Fill(ds, "TestTable");
            dataGridView1.DataSource = ds.Tables["TestTable"].DefaultView;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            if(f2.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show(f2.textBox1.Text);
                string sqlInsert = "INSERT INTO TestTable(Name) VALUES('" + f2.textBox1.Text + "')";
                SqlConnection conn = new SqlConnection(sqlConnectString);
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqlInsert, conn);
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }
    }


PM MAIL   Вверх
Partizan
Дата 4.8.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



Ald, поюзать DataBinding...
с вопросами "что это такое" - в гугль или в поиск по форуму


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
vretsky
Дата 4.8.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



создайте датаАдаптер и датаСет как члены класса,проинициализируйте их в конструкторе и напишите метод заполнения грида новыми данными:

Код

private void fillDGV()
{
            ds .Clear();
            da.Fill(ds, "TestTable");
            dataGridView1.DataSource = ds.Tables["TestTable"].DefaultView;
}



Код

private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            if(f2.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show(f2.textBox1.Text);
                string sqlInsert = "INSERT INTO TestTable(Name) VALUES('" + f2.textBox1.Text + "')";
                SqlConnection conn = new SqlConnection(sqlConnectString);
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqlInsert, conn);
                cmd.ExecuteNonQuery();
                conn.Close();
            }
            this.fillDGV();

        }


PM MAIL   Вверх
Ald
Дата 4.8.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 31.7.2008

Репутация: нет
Всего: нет



Спасибо за помощь, разобрался.
PM MAIL   Вверх
lasar777
Дата 23.4.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Программу пишу в Vs2005 С++/CLI (Windows forms).
Есть две формы: Form1 и Form2. На Form1 имеется DataGirdView c данными из БД и кнопка Button1. При нажатии на кнопку открывается вторая форма с кучей textBox'ов. В них заносим текстовую информацию и после нажатия на кнопке OK (ОК находится на Form2) вторая форма закрывается, а в базу данных заносится новая строка. 

Процедура открытия 2 формы проста:
Код

             Form2^ nufrm = gcnew Form2();
             nufrm->MdiParent = this->MdiParent;
             nufrm->Show();

Чтобы все работало в Form1.h подключаем заголовочный файл #include "Form2.h".

С процедурой добавления записи в базу данных тоже проблем нет: заполняем текстовые поля, нажимаем кнопку ОК
Код

                String ^strConn, ^strSQL;
                strConn = "Provider=...................................";
                strSQL = "SELECT [Н......................"    
                OleDbDataAdapter^ daa = gcnew OleDbDataAdapter(strSQL, strConn);
                DataSet^ dss = gcnew DataSet();
                                daa->Fill(dss, "UseTable"); 

                // добавление новой строки

                 daa->Update(tbl);


                        // ВОТ ЗДЕСЬ ИДЕТ ОБНОВЛЕНИЕ DataGridView формы Form1
                                Form1::dataGridView1->DataSource = dss->Tables["UseTable"]->DefaultView;     

                         Form2::Visible = false;




Проблема в следующем. Чтобы обновить DataGridView, необходимо использовать свойства Form1. Т.е. необходимо подключить в форме "Form2.h" заголовочный файл #include "Form1.h". Если заголовочный файл не подключать, то свойств Form1 из Form2.h компилятор не видит и после закрытия второй формы DataGridView первой формы не меняется несмотря на добавление записи.
Но если в Form1 не включать #include "Form2.h", то будет невозможно открыть из первого окна второе.
 Если подключить #include "Form2.h" в файле Form1, а #include "Form1.h"в файле "Form2.h", то компилятор выдает ошибку 

Цитата

fatal error C1014: too many include files : depth = 1024


Насколько я смог разобраться, это означает что препроцессор циклично подключает заголовочные файлы. Пробовал прописывать подключения после директивы #pragma once, но это не помогло. 

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




PM MAIL   Вверх
-Mikle-
Дата 23.4.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



Общий подход таков, чтобы не делать вот такого:
Цитата(lasar777 @  23.4.2009,  03:57 Найти цитируемый пост)
обновить DataGridView, необходимо использовать свойства Form1

Все должно работать автоматом. DataSet должен быть в общей области видимости для всего приложения (в статическом классе, например). Также и вся работа по его заполнению из БД и обновлению БД из него, тоже должна быть там же, где и DataSet. Назовем этот класс, к примеру, DataManager. Далее все просто, в первой форме пишем привязку
Код

    DataGridView->DataSource = DataManager.MyDataSet["UseTable"];

во второй форме по кнопке Ок
Код

    DataTable^ useTable = DataManager.MyDataSet["UseTable"];
    DataRow^ row = useTable->NewRow();
    row["col1"] = .....;
    row["col2"] = .....;
    useTable->Rows->Add(row);
    // вот уже после этих строк DataGridView на первой форме обновится
    // далее просто сохраняем DataSet в БД
    DataManager.UpdateUseTable();


В DataManager должны находится все необходимые DataAdapter'ы с установленными свойствами SelectCommand, Insert..., Update..., Delete... . Также там будет хранится твой DataSet. Все эти объекты нужно создать и инициализировать только один раз за все время выполнения приложения. Сделай в этом классе методы типа FillИмяТаблицы и UpdateИмяТаблицы. И будет тебе счастье.

Добавлено через 4 минуты и 5 секунд
Забыл сказать, что такой способ разделения логики работы с БД от логики самого приложения подходит для небольших систем и только для начала. Для больших систем и после получения определенного опыта, более удобно будет применять специальные ORM системы, коих не мало сейчас (мне нравится EntityFramework от Microsoft).


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
lasar777
Дата 23.4.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



 Спасибо, -Mikle-! Принцип понятен, сейчас попробую реализовать ))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.