Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по откату изменений в DataSet / 20 сообщений из 20, страница 1 из 1
30.07.2004, 14:07
    #32629422
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Есть форма(Компания), на ней 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
30.07.2004, 14:34
    #32629521
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
в своё время делал так: для каждой popup формы создавался dataset, в который копировались данные для изменения/добавления/удаления [их получалось немного и дублирование было миним.]. по кнопке ОК они мержились (merge) с основным dataset'ом (по cancel ничего не делалось)
...
Рейтинг: 0 / 0
30.07.2004, 15:17
    #32629648
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
играть на AcceptChanges/RejectChanges мне было нельзя, т.к. в конечном счете нужно было делать обновление в БД


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

PS: извини за C# :-)
...
Рейтинг: 0 / 0
30.07.2004, 15:32
    #32629687
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Понятно, сейчас попробую изобразить на VB.NET
...
Рейтинг: 0 / 0
30.07.2004, 16:23
    #32629849
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Написал так:
Код: 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
30.07.2004, 16:59
    #32629931
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
для Added строк - их нужно просто убивать в коллекции через Remove:
Код: plaintext
dataSet.Tables[ 0 ].Rows.Remove(row);
...
Рейтинг: 0 / 0
30.07.2004, 17:07
    #32629948
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
теперь у меня вопрос:
а почему ты не делаешь
Код: plaintext
dataSet.Tables["ContragentSotrudnTbl"].RejectChanges();
ведь получается, что ты практически повторяешь код этого метода для таблицы ?
---
PS: возможно не видно фильтрации (отбора) строк для восстановления ?
...
Рейтинг: 0 / 0
30.07.2004, 17:13
    #32629960
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Мне нельзя делать Reject для всей таблицы, т.к. там содержаться значения для разных контрагентов.

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

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

Код: 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
30.07.2004, 18:14
    #32630091
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
извини, в тонкостях vb.net слабо ориентируюсь, но есть ли в нём оптимизатор для if ?
может надо делать каскад из простых условий:
Код: plaintext
1.
2.
3.
If ...RowState = DataRowState.Deleted
  If ...=...
  End If
End If
...
Рейтинг: 0 / 0
30.07.2004, 20:51
    #32630212
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
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
30.07.2004, 21:13
    #32630225
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Кузя
извини, в тонкостях vb.net слабо ориентируюсь, но есть ли в нём оптимизатор для if ?
может надо делать каскад из простых условий:


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

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

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
31.07.2004, 20:20
    #32630467
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Спасибо всем, в итоге написал так:
Код: 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
31.07.2004, 20:22
    #32630469
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Ошибся чуть чуть.

Код: 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
01.08.2004, 11:58
    #32630576
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Прикольный код, тока тут на форуме прозвучала идея, что использовать 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
01.08.2004, 12:06
    #32630581
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по откату изменений в DataSet
Да, на всякий случай, теперь
row = CompanyForm.dsCompany.Tables("ContragentSotrudnTbl").Rows(i)
и обрасчаться к ней нужно именно так...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по откату изменений в DataSet / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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