Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как обновить данные в DataGrid? / 6 сообщений из 6, страница 1 из 1
18.12.2012, 21:57
    #38084234
SanSagittarius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить данные в DataGrid?
Ребята, помогите разобраться с процедурой обновления записи в DataGrid. Признаюсь, я очередной самоучка, который добрался до Visual Studio, поэтому мучаюсь над такими, наверняка, простыми задачами...

Сделал форму с поиском, куда вываливаются записи по критерию Like из базы MS Access, после чего по клику выдается инфа по конкретной записи. До этого момента все получилось более-менее сделать.

Дальше пытаюсь отредактировать эту конкретную запись (по задумке - вызываю функцию редактирования) и здесь у меня возник глобальный затык... (((

Код привожу здесь:

Код: vbnet
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.
Imports System.Data.OleDb
Public Class Form1

    Public DS As DataSet
    Private DATASET2 As DataSet
    Public DA As OleDb.OleDbDataAdapter
    Public FirstCell As DataGridViewCell

    Private CO As New OleDb.OleDbConnection("Data Source=""C:\DBDocs\Docs_be.accdb"";User ID=Admin;Provider=""Microsoft.ACE.OLEDB.12.0"";")

    Private CB As OleDb.OleDbCommandBuilder
    Dim COMMAND = New OleDbCommand

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub


    Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

        Dim cell As DataGridViewCell = CType(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex), DataGridViewCell) 

        Me.TextBox1.Text = cell.Value.ToString 
        Me.TextBox2.Text = DataGridView1.Columns(e.ColumnIndex).HeaderText 
        Dim FirstCell As DataGridViewCell = CType(DataGridView1.Rows(e.RowIndex).Cells(0), DataGridViewCell)
        Me.TextBox3.Text = FirstCell.Value.ToString
        Dim DS As New DataSet
        If CO.State = ConnectionState.Closed Then CO.Open() 
        DA = New OleDb.OleDbDataAdapter("Select * From [Документы] where ([Код] = " & FirstCell.Value.ToString & ")", CO)
        CB = New OleDb.OleDbCommandBuilder(DA)

        DA.Fill(DS, "Документы")
        DataGridView2.DataSource = DS.Tables("Документы")
        CO.Close()
    End Sub

    Private Sub Button2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'ByVal sender As System.Object, ByVal e As System.EventArgs

        CreateCmdsAndUpdate("Data Source=""C:\DBDocs\Docs_be.accdb"";User ID=Admin;Provider=""Microsoft.ACE.OLEDB.12.0"";", "Select * From Документы")

    End Sub


    Private Sub TextForFind_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextForFind.TextChanged
        Dim CO As New OleDbConnection("Data Source=""C:\DBDocs\Docs_be.accdb"";User ID=Admin;Provider=""Microsoft.ACE.OLEDB.12.0"";")
        CO.Open()
        Dim COMMANDFORVIEW As New System.Data.OleDb.OleDbCommand("Select * From [Документы] where ([Тип документа] like '%" & Me.TextForFind.Text & "%')", CO)
        Dim ADAPTER As New OleDbDataAdapter(COMMANDFORVIEW)

        Dim DATASET2 As New DataSet

        ADAPTER.Fill(DATASET2, "Документы")
        DataGridView1.DataSource = DATASET2
        DataGridView1.DataMember = "Документы"
        CO.Close()
    End Sub


    Public Function CreateCmdsAndUpdate(ByVal connectionString As String, ByVal queryString As String) As DataSet

        Using connection As New OleDbConnection(connectionString)
            Dim adapter As New OleDbDataAdapter()
            adapter.SelectCommand = New OleDbCommand(queryString, connection)
            Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)

            connection.Open()

            Dim customers As DataSet = New DataSet
            Dim DS As DataSet = New DataSet
            adapter.Fill(DS)
 
            COMMAND.CommandText = "UPDATE [Документы] SET [Тип документа] = ?, [Номер] = ?  WHERE [Код] = ?"
            COMMAND.Parameters.Add("Тип документа", OleDbType.VarWChar, 50, "Тип документа")
            COMMAND.Parameters.Add("Номер", OleDbType.VarWChar, 50, "Номер")
            COMMAND.Parameters.Add(New OleDbParameter("Original_Код", OleDbType.Integer, 0, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Код", System.Data.DataRowVersion.Original, Nothing))
            adapter.UpdateCommand = COMMAND
            COMMAND.Connection = connection

            adapter.Update(DS)

            Dim rows() As DataRow = customers.Tables(0).Select(Nothing, Nothing, DataViewRowState.Added)
            adapter.Update(rows)

            Return customers
        End Using
    End Function


End Class



Понимаю, что код криворукий, но это, можно сказать мой "первый блин", за что прошу вашего понимания и очень надеюсь на помощь... Где я накосячил?
...
Рейтинг: 0 / 0
18.12.2012, 22:07
    #38084242
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить данные в DataGrid?
SanSagittariusГде я накосячил?
Вы попытались все полностью написать вручную.
Это возможно только после того, как вы изучите все применяемые Вами классы.
Сделайте все в дизайнере
...
Рейтинг: 0 / 0
19.12.2012, 09:28
    #38084499
SanSagittarius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить данные в DataGrid?
Cat2Сделайте все в дизайнере

Полностью с Вами согласен - по-хорошему, нужно сначала все изучить, а потом уж строить. Но не всегда это получается... Кроме того, в изученных мной материалах рассматриваются несколько иные варианты - моего случая я не нашел, поэтому и решил попытать счастья здесь...

Собственно, формы я как-раз строил в дизайнере, после чего, следуя мануалам, пытался допилить то того, что мне нужно было. Сейчас в формах все отображается корректно (я писал об этом выше) и можно изменять записи. Но изменения не сохраняются ни при переходе на другую запись, ни при нажатии на кнопку "Сохранить". Собственно, в этом проблема...

Если подскажете, как облегчить себе жизнь и заставить данные сохраняться, сделав некие настройки в дизайнере - буду весьма признателен!
...
Рейтинг: 0 / 0
19.12.2012, 16:10
    #38085352
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить данные в DataGrid?
SanSagittarius,
Через ADAPTER.Update(DATASET2, "Документы")
Как записать dataSet в Access базу?

Подробно, от первоисточника
...
Рейтинг: 0 / 0
19.12.2012, 18:38
    #38085668
SanSagittarius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить данные в DataGrid?
Cat2,

Огромное спасибо за помощь и за ссылочки! Принялся за штудирование - лишним точно не будет.

Однако, проблема все же не поддалась решению ((((

На данную корректировку
Код: vbnet
1.
ADAPTER.Update(DATASET2, "Документы")



реагирует следующим образом:
Код: vbnet
1.
2.
"в System.Threading.ThreadHelper.ThreadStart()</StackTrace><ExceptionString>System.ArgumentNullException: Значение не может быть неопределенным."
"Имя параметра: dataSet"



Такое ощущение, что DataSet2 не был объявлен, хотя я его объявлял пабликом:
Код: vbnet
1.
Private DATASET2 As DataSet
...
Рейтинг: 0 / 0
19.12.2012, 20:47
    #38085832
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить данные в DataGrid?
SanSagittarius,

Как минимум Вы его еще второй раз определили в
Private Sub TextForFind_TextChanged.
Трудно разобраться в чужих ошибках

Выглядит на C# примерно так

Код: 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.
namespace TCH_storage
{
    public partial class FormDicPlace : Form
    {
	/*
	Приблизительно такой код генерируется в дизайнере. 
	В действительности его в данном событии  нет
	*/

	private DataTable dtPlace = new DataTable("Place");
	...
	private DataSet ds = new DateSet()
	...
	ds.Tables.Add(dt);
	...
            placeBindingSource.DataSource = ds;
            placeBindingSource.DataMember = "Place";
	...
            placeDataGridView.DataSource = placeBindingSource;
	//Конец того, чего нет на форме в действительности

        public FormDicPlace()
        {
            InitializeComponent();
        }

        private void FormDicPlace_Load(object sender, EventArgs e)
        {
            placeTableAdapter.Fill(dtPlace); 
            dtPlace.RowChanged += dtPlaceRowChanged;
            dtPlace.RowDeleted += dtPlaceRowChanged;
        }

	// Это выполняется автоматически при переходе на другую строку, если есть изменения в ячейках
        void dtPlaceRowChanged(object sender, RowChangeEvent e)
        {
            placeTableAdapter.Update(dtPlace);
        }
	
	//Это вызывается, например, в событии  нажатия кнопки Сохранить
	void save () 
	{
	placeBindingSource.EndEdit(); //Это вызывает событие dtPlaceRowChanged
	}
    }
}
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как обновить данные в DataGrid? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]