powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по откату изменений в DataSet
20 сообщений из 20, страница 1 из 1
Вопрос по откату изменений в DataSet
    #32629422
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть форма(Компания), на ней DataGrid(Список контрагентов), при выделении строки в DataGrid(Список контрагентов) и нажатии кнопки Edit открывается еще одна форма(Контрагент компании), по мимо прочего на ней есть еще один DataGrid(Список сотрудников контрагента) и кнопки New(Новый сотрудник),Edit(Модифицировать сотрудника),Delete(Удалить сотрудника).При работе с этими кнопками измененные данные заносятся в DataSet.
Так же на форме(Контрагент компании) есть кнопки OK и Cancel. По кнопке ОК соответственно все изменения остаются в DataSet, для последующей передачи на SQL Server, а вот при нажатии Cancel все изменения в DataSet должны откатываться к исходному состоянию.
Дело ослажняется тем, что в таблице с (Список сотрудников контрагента) храняться сотрудники всех контрагентов данной компании.
Т.е. если допустим пользователь поработал с одним контрагентом добавил удалил сотрудников нажал ОК, потом поработал с другим контрагентом обавил удалил сотрудников нажал Cancel, то должны откатится изменения только по последнему контрагенту.
Как сие организовать?

Подобная конструкция не работает, пишет что не может получить данных от строки которая помечена как Deleted

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim i As Integer
For i =  0  To CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Count -  1 

    If (CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Added _
    	Or CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Modified _
    	Or CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Deleted) _
    	And (CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId") = CompanyForm.selRow("CompanyContragentId")) Then

        'Вернуть к прежнему состоянию
        CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()

    End If

Next i
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629521
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в своё время делал так: для каждой popup формы создавался dataset, в который копировались данные для изменения/добавления/удаления [их получалось немного и дублирование было миним.]. по кнопке ОК они мержились (merge) с основным dataset'ом (по cancel ничего не делалось)
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629648
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
играть на AcceptChanges/RejectChanges мне было нельзя, т.к. в конечном счете нужно было делать обновление в БД


конкретно по твоему вопросу - достучаться до значений удаленных строк можно только так:
Код: plaintext
dataSet.Tables[ 0 ].Rows[i]["ColName", DataRowVersion.Original];

PS: извини за C# :-)
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629687
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно, сейчас попробую изобразить на VB.NET
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629849
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
For i =  0  To CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Count -  1 
	If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Deleted _
	   And CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId", DataRowVersion.Original) = CompanyForm.selRow("CompanyContragentId") Then

		CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
	End If

	If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Added _
	   And CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId") = CompanyForm.selRow("CompanyContragentId") Then

		CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
	End If

	If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Modified _
	   And CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId") = CompanyForm.selRow("CompanyContragentId") Then

		CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
	End If
Next i

Но что делать со строками которые Added? Ведь у них как я понимаю нет версии Original и RejectChanges() не проходит?
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629931
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для Added строк - их нужно просто убивать в коллекции через Remove:
Код: plaintext
dataSet.Tables[ 0 ].Rows.Remove(row);
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629948
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь у меня вопрос:
а почему ты не делаешь
Код: plaintext
dataSet.Tables["ContragentSotrudnTbl"].RejectChanges();
ведь получается, что ты практически повторяешь код этого метода для таблицы ?
---
PS: возможно не видно фильтрации (отбора) строк для восстановления ?
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629960
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нельзя делать Reject для всей таблицы, т.к. там содержаться значения для разных контрагентов.

----
Дело ослажняется тем, что в таблице (Список сотрудников контрагента) храняться сотрудники всех контрагентов данной компании.
Т.е. если допустим пользователь поработал с одним контрагентом добавил удалил сотрудников нажал ОК, потом поработал с другим контрагентом обавил удалил сотрудников нажал Cancel, то должны откатится изменения только по последнему контрагенту(где нажали Cancel).
----
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629982
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь увидел :-) филтрацию по коду

а как же быть в случае повторного редактирования списка для одного и того же контрагента ? ведь откат то не учитывает, что было в предыдущий раз ОК - откатит то все изменения по этому к/агенту ...
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32629987
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал так :
Код: plaintext
1.
CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Remove(CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i))
Но не получается, пишет
There is no Original data to access.
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630012
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это из-за того, что ты используешь индексер во внешнем цикле (и изменяешь список внутри этого цикла). сформируй массив (или ArrayList) из удаляемых записей, а затем уже в самостоятельном цикле по этому списку проводи Remove.
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630023
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую.
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630057
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается, все равно пише тоже самое.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim addRow( 10 ) As DataRow
.
.
If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState = DataRowState.Added _
   And CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId") = CompanyForm.selRow("CompanyContragentId") Then
	addRow(j) = CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i)
	j = j +  1 
End If
.
.
.
'Удаляем Add записи.
For i =  0  To addRow.Length -  1 
    CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Remove(addRow(i))
Next
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630091
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извини, в тонкостях vb.net слабо ориентируюсь, но есть ли в нём оптимизатор для if ?
может надо делать каскад из простых условий:
Код: plaintext
1.
2.
3.
If ...RowState = DataRowState.Deleted
  If ...=...
  End If
End If
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630212
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dencat
Еще я не врубился но сразу совет - фиксируй Rows.Count до цикла
Код: plaintext
1.
2.
3.
4.
myCount = CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Count -  1 
' мой цикл
for i = 1 to myCount
'bla - bla - bla

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630225
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузя
извини, в тонкостях vb.net слабо ориентируюсь, но есть ли в нём оптимизатор для if ?
может надо делать каскад из простых условий:


По умолчанию в VB.NET boolean short-circuited не используется, но если поставить вместо And - AndAlso, а вместо Or - OrElse то получится аналогично C#.

2 dencat
попробуйте AndAlso у себя, либо следуйте совету по If Кузя

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630467
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем, в итоге написал так:
Код: plaintext
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.
myCount = CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Count -  1 

        For i =  0  To myCount

            Select Case CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState

                'Обрабатываем удаленные записи
            Case DataRowState.Deleted
                    If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId", DataRowVersion.Original) = CompanyForm.selRow("CompanyContragentId") Then
                        CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
                    End If

                    'Обрабатываем измененные записи.
                Case DataRowState.Modified
                    If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId", DataRowVersion.Original) = CompanyForm.selRow("CompanyContragentId") Then
                        CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
                    End If

                    'Обрабатываем добавленные записи.
                Case DataRowState.Added
                    If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId") = CompanyForm.selRow("CompanyContragentId") Then

                        CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Remove(CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i))
                        'CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.

                    End If
            End Select
        Next i
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630469
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся чуть чуть.

Код: plaintext
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.
myCount = CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Count -  1 
For i =  0  To myCount
	Select Case CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RowState
	 'Обрабатываем удаленные записи
 
	    Case DataRowState.Deleted
	        If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId", DataRowVersion.Original) _
	           = CompanyForm.selRow("CompanyContragentId") Then
	            CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
	        End If

         'Обрабатываем измененные записи.
 
	    Case DataRowState.Modified
	        If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId", DataRowVersion.Original) _
	           = CompanyForm.selRow("CompanyContragentId") Then
	            CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).RejectChanges()
	        End If

         'Обрабатываем добавленные записи.
 
	    Case DataRowState.Added
	        If CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i).Item("CompanyContragentId") _
	           = CompanyForm.selRow("CompanyContragentId") Then
	            CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows.Remove(CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i))
	        End If
	End Select
Next i
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630576
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольный код, тока тут на форуме прозвучала идея, что использовать For each удобнее и, работает он побыстрее, да и сам код покрасивше будет...
Попробуй так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
For each row as System.Data.Datarow in CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows
	Select Case row.RowState
	..........
             и т.д.
             ..........
             End Select
Next
...
Рейтинг: 0 / 0
Вопрос по откату изменений в DataSet
    #32630581
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, на всякий случай, теперь
row = CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i)
и обрасчаться к ней нужно именно так...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по откату изменений в DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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