Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > DataGridView и привязка данных


Автор: shell14 4.5.2007, 03:58
Суть проблемы: таблица их БД отображается с помощью DataGridView, хочу чтобы при добавлении новой строки или изменении каких то данных, после нажатия на кнопку сохранить, вносились изменения в БД.
Есть решение, которого я хочу добиться (см картинку), его генерит студия 2005, при переносе таблицы их БД на форму. Но там слишком много всего (она полностью изучает БД и генерит все связи, очень много и громоздко).

Хочеться найти хороший мануал по DataGridView и привязке данных. Никто не подскажет?

Просто не могу понять, решать вопрос именно о привязке данных? или может быть проще получить изменения сделанные в DataGridView и просто написать обработчик для внесения изменений в БД?
Но хотелось бы чтобы работало именно как в примере. Как этого можно добиться?
Еще может кто подскажет грамотное решение, как отобразиь в DataGridView двумерный массив? не хочеться класс писать, потому что просто массив даблов.

Автор: Papirus 4.5.2007, 10:03
У DataGridView есть свойство DataSource, которому можно назначить таблицу. Примерно так:

Код


        Using cn As New SqlClient.SqlConnection(My.Settings.cnn) 

            Dim cmd As New SqlClient.SqlCommand("Select * From MyTable", cn)
            cn.Open()
            Dim rd As SqlClient.SqlDataReader = cmd.ExecuteReader
            Dim tbl As New DataTable
            tbl.Load(rd)
            rd.Close()
            rd = Nothing
            Me.DataGridView1.DataSource = tbl         
        End Using




Если надо на C# могу и в этом виде (просто VB привычнее) smile

Добавлено через 9 минут и 9 секунд
Можно далее действовать разными способам
- создать датаадаптер и прописать свой код обновления данных
- получать в отдельную таблицу изменения и обрабатывать построчно. Если tbl объявлена на уровне модуля, то

 
Код

Dim tblChange As New DataTable = tbl.GetChanges
        For Each rw As DataRow In tblChange
            Select Case rw.RowState
                Case DataRowState.Added
                Case DataRowState.Deleted
                Case DataRowState.Modified

            End Select
        Next

Автор: shell14 4.5.2007, 12:13
Ну да про DataSource я в курсе. Я делал примерно также, только брал DataSet, и заполнял его через SqlDataAdapter
Потом этот датасет подсовываю DataGridView.DataSource и он все отображает.
А вот можно про адаптер поподрообнее? Т.е. все изменения получать через него?  Его надо как то привязывать?

Или я вообще не в ту область лезу? так понимаю что можно не использовать привязку данных напрямую, а просто получать изменения и самому их обрабатывать?

Автор: mr.DUDA 5.5.2007, 18:43
Адаптер - только для получения датасета из БД или применения изменений датасета на базу данных. Если в приложении надо получить изменения, произошедшие с набором данных - дёргаем dataSet.GetChanges().

Автор: darkness 7.5.2007, 06:41
По сабжу.
поправьте где я ошибаюсь:
имеем примерно след код:
Код

MySqlDataAdapter adap=new MySqlDataAdapter("SELECT * FROM STUDENTS", conn);
adap.Fill(ds, "Studi");

// имеем некий GridView, gD1 к примеру,
// теперь прикручиваем данные из датасета а конкретнее из таблицы "Studi" к нему

gD1.DataSource=ds.Tables["Studi"];      


т.к. DataSet GridView это классы, представляющие из себя
ссылочные типы следовательно  gD1.DataSource ссылается туда же что ds.Tables["Studi"]....
и любое изменение пользователем данных на Гриде отражается и на  самой  таблице...

Щёлкаем кнопку "сохранить" для вступления изменений в силу:
Код

ds.GetChanges();  //тут обновляется сам ДатаСэт, но что с БД?

загвоздка у меня в том, как обновить саму БД.... Предположим мы исправили две строки и одну добавили,
как получить доступ именно к тем элементам которые были изменены (Добавлены), чтобы уже на основании этого форимровать запросы UPDATE INSERT ???

Вообщем немного запутался... 

Автор: mr.DUDA 7.5.2007, 09:08
Полученный из GetChanges датасет отдаём адаптеру в метод Update:

Код
adap.Update (ds.GetChanges( ));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)