0

나는이 동일한 문제를 주장하는 bazillion 게시물을 보았을 것이라고 약속합니다. 그래서 나는 아직도 저주를 받았다고 용서해주십시오.VB.net DataRow.RowState가 업데이트되지 않습니다

강력한 형식의 데이터 집합을 포함하는 VS2008 스마트 장치 프로젝트가 있습니다. 사용자는 데이터 집합에 새 레코드를 만들 때마다 값을 입력하고 저장 할 수 있습니다. 사용자가 값을 편집하려면 행을 편집 할 수있는 입력에 사용할 수있는 값이 들어있는 여러 개의 콤보 상자가있는 모달 자식 양식이 표시됩니다. 각 콤보 상자가 아래의 방식으로 자식 폼의 생성자에 바인딩 :

With cmbSize 
     .DataSource = frmMain.dstConfig.Sizes 
     .DisplayMember = "Display" 
     .ValueMember = "Value" 
     .DataBindings.Add("SelectedValue", trowNewRow, "SIZE", True, DataSourceUpdateMode.OnPropertyChanged) 
End With 

dstConfig이 제약 조건을 포함하는 테이블의 데이터 집합입니다. 소스의 디스플레이 및 값 구성원에 바인딩하면 정상적으로 작동합니다.

trowNewRow는 사용자가 편집 절차를 시작할 때 기본 양식에서 전달 된 데이터 세트의 행에 대한 참조이며 행을 매개 변수 "ByRef"로 전달하여 하위 양식으로 전달합니다. 강력한 타이핑이 보존됩니다. 이 일이 발생했을 때 내가 알지 못하는 일종의 단절이있을 수 있습니다. 데이터 세트에서 "선택"절차를 수행하고 편집 할 행에 해당하는 고유 한 ID 필드로 필터링하여 참조를 전달합니다. 결과는 첫 번째 (및 유일한) 항목을 내 객체로 전달하는 데이터 세트와 동일한 스키마의 강력한 유형의 행이있는 단일 항목 배열입니다.

사용자가 확인 버튼을 클릭하여 변경 사항을 제출하면 변경 사항이 실제로 수행되었는지 여부를 평가하는 절차가 트리거됩니다. 이 작업을 수행하는 가장 좋은 방법은 trowNewRow의 RowState를 확인하는 것입니다. 그러나 RowState는 변경 내용과 관계없이 "추가됨"상태로 유지됩니다. 행의 값을 수동으로 확인하면 변경 내용이 실제로 기록되었음을 나타냅니다. trowNewRow의 AcceptChanges 프로 시저가 내 코드에서 명시 적으로 호출되지 않았 음을 확인했습니다.

나는 다음과 같은 시도 : 수동으로 콤보 상자 'BindingManagerBase에 EndCurrentEdit 프로 시저를 호출 콤보 상자 3)에 WriteValue을 수행 trowNewRow 의지며 EndEdit 절차 2)를 호출 1.) 4 객체.) 위의 모든 조합

아이디어 나 해결책을 미리 주셔서 감사합니다.

+1

두 개의 긴 단락 대신 관련 코드를 사용하면 문제를 더 잘 보여주고 지루함을 줄일 수 있습니다. rowstate가 추가되면 dataadapter가 데이터베이스를 업데이트하지 않았다는 의미입니다. 그것이 뉴 로우이기 때문에, 당신이 그것을 저장할 때까지 그것은 새로운 행으로 남아 있습니다 (아무리 많은 편집/변경이 있더라도). – Plutonix

답변

1

DataRow에는 원래 세트와 현재 세트의 두 세트의 데이터가 들어 있으며, RowState에는 두 세트의 데이터가 포함되어 있습니다. 원래 데이터가 없지만 현재 데이터가있는 경우 RowStateAdded입니다. @Plutonix에 따르면 현재 데이터를 편집 할 때 원본 데이터를 추가하지 않으므로 추가 변경을 수행하더라도 RowStateAdded으로 남습니다. 현재 데이터가 없지만 원래 데이터가있는 경우 RowStateDeleted입니다. 현재 데이터가 원래 데이터와 일치하면 RowStateUnchanged이고, 그렇지 않으면 Modified입니다.

당신이 데이터 어댑터 또는 테이블 어댑터 Update 전화

InsertCommand, 각 Added 행에 대해 실행되는 UpdateCommandModified 행에 대해 실행되고 DeleteCommandDeleted 행에 대해 실행됩니다. 저장에 성공하면 어댑터는 암시 적으로 AcceptChanges을 호출합니다. 모든 Deleted 개의 행이 DataTable에서 제거되고 현재 값이 AddedModified 행으로 원래 값보다 많아지고 RowStateUnchanged으로 변경됩니다.

따라서 RowState은 마지막으로 데이터베이스에 저장 한 이후의 변경 내용을 추적하기위한 것입니다. 모든 편집 후에 변경 사항을 데이터베이스에 저장하지 않는 한 사용자가 UI에서 변경을했는지 여부를 판별하는 데 사용할 수 없습니다. 미세한 변경 추적을 원한다면 직접 구현해야합니다. 개인적으로, 나는 그 경우에는 바인딩하지 않고 사용자가 확인을 클릭하여 데이터를 DataRow으로 보낼 때까지 기다립니다. 또한 이전 편집을 잃지 않고 최신 편집을 취소 할 수 있습니다.