2017-11-15 5 views
2

저는 VB.net과 WPF를 처음 보았습니다. 그러나 나는 주로 PHP와 자바 프로그래밍에 대한 경험이있다. 내 길을 건너 온 함정의 대부분을 통해 자신을 밀어 냈지만 지금 나는 해결할 현명한 방법이 있어야한다고 생각한 것을 발견했습니다. 내가 VB.net, WPF와 MS Access 데이터베이스를 사용하고VB.net, WPF 및 중첩 데이터 모델 : 데이터베이스에 다시 쓰는 가장 좋은 방법은 무엇입니까?

: 여기

무슨 뜻인지입니다. 이것은 협상 할 수 없으며 다른 데이터베이스를 사용할 수 없습니다. 내 데이터 모델은 다음과 같이 serveral 중첩 된 개체를 구성 : 내 데이터베이스 모델을 반영하기 위해 데이터베이스에서 정보를 읽고 해당 객체를 생성하는 OLEDB 연결을 사용하고

Public Class subSubObject 
    Public Property id as int32 
    Public Property description as string 
End Class 

Public Class subObject 
    Public Property id as int32 
    Public Property description as string 
    Public Property subSubObjects as list (of subSubObject) 
End Class 

Public Class MainObject 
    Public Property id as int32 
    Public Property description as string 
    Public Property subObjects as list (of subObject) 
End Class 

Public Class DataModel 
    Public Property MainObjects as list (of MainObject) 
End Class 

. 그래서이 순간 데이터베이스와 데이터 모델은 동일합니다. 이제 행 세부 정보가 포함 된 WPF DataGrid를 사용하여 데이터 모델의 변경 내용을 처리합니다. 즉, 개체 삭제, 새 개체 및 새 하위 개체 만들기 등을 의미합니다. ID는 응용 프로그램이 아니라 데이터베이스 엔진에서 관리합니다. 데이터베이스에 새 데이터 집합을 입력하면 자동으로 새 ID가 생성됩니다.

<DataGrid x:Name="dgDataModel" 
    AutoGenerateColumns="true" CanUserAddRows="true" ItemsSource="{Binding DataModel}"> 

      <DataGrid.Columns> 
       <DataGridTemplateColumn Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 

          <DataGrid x:Name="dgMainObjects" 
           AutoGenerateColumns="False" CanUserAddRows="True" ItemsSource="{Binding Path=MainObjects}"   
           IsReadOnly="False"> 

           <DataGrid.Columns> 
            <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}" IsReadOnly="True" /> 
            <DataGridTextColumn Header="Description" Binding="{Binding Path=Description}" /> 
           </DataGrid.Columns> 

           <DataGrid.RowDetailsTemplate> 
            <DataTemplate> 
             <DataGrid x:Name="dgRegelsaetze" AutoGenerateColumns="False" ItemsSource="{Binding Path=subObjects}"> 

              <DataGrid.Columns> 
               <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/> 
               <DataGridTextColumn Header="Description" Binding="{Binding Description}" /> 
              </DataGrid.Columns> 

              <DataGrid.RowDetailsTemplate> 
               <DataTemplate> 

                <DataGrid x:Name="dgSubSubObjects" 
                 AutoGenerateColumns="False" ItemsSource="{Binding Path=SubSubObjects}"> 

                 <DataGrid.Columns> 
                  <DataGridTextColumn Header="ID" Binding="{Binding Path=RegelID}" IsReadOnly="True"/> 
                  <DataGridTextColumn Header="Beschreibung" Binding="{Binding RegelBeschr}" /> 
                 </DataGrid.Columns> 

               </DataTemplate>        
             </DataGrid> 
            <DataTemplate> 
           </DataGrid.RowDetailsTemplate> 

          </DataGrid> 

         </DataTemplate> 
        </DataGrid.RowDetailsTemplate> 

       </DataGrid> 

      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 

</DataGrid> 

이 코드는 작동하지 않습니다. 응용 프로그램을 작성하는 방법을 알려주는 것입니다. 이제 wpf datagrid를 사용하여 datamodel을 변경 한 후에 변경 사항을 다시 데이터베이스에 기록해야합니다. 대부분 그것에 관한 문제는 없습니다. 난 그냥 정기적으로 INSERT 및 UPDATE 작업을 수행합니다. 하지만 삭제 작업이 여기에있는 문제임을 알았습니다. 이것은 DataGrid에서 DEL 키를 눌러 Object를 삭제 한 후에도 사인하지 않고 사라 졌기 때문입니다. ID 나 다른 것이 없기 때문에 SQL에서 필요한 DELETE 조작을 작성할 수 없습니다.

그래서이 문제는 DataGrid의 CommandManager.PreviewExecuted 속성을 사용하여 해결하려고했습니다. 삭제 된 Object를 잡아서 별도의 목록에 저장하는 하위를 정의 할 수있는 기회를줍니다. 이 목록을 사용하여 나중에 DELETE 명령을 작성할 수 있습니다. 적어도 그것이 내 생각이었습니다.

불행히도 명령이 캐스케이드의 모든 수준에서 실행된다는 것을 알게되었습니다. 그래서 내 DataGrid의 세 번째 레벨에서 subSubObject의 인스턴스를 말하도록하자. 하위는 allele에 대해서도 해고된다. 그래서 나는 삭제 된 객체로 채워질뿐만 아니라 부모 객체로만 채워지는 목록으로 끝을 맺을 것입니다.

삭제 프로세스가 너무 복잡하다는 것을 나는 믿을 수 없다. 나는이 문제를 가진 최초의 사람이라고 생각하지 않기 때문에 이것을 해결할 수있는 우아한 방법이 있어야합니다. 당신 중 누구도 아이디어가 있습니까?

미리 감사드립니다. Daniel

답변

0

MainObjects 컬렉션에 ObservableCollection을 사용한다고 가정하면 CollectionChanged 이벤트를 처리해야합니다. BindingList로 변경할 수도있는 것 같습니다. 처리를 위해 상기 StackOverflow의 포스트에서 참조는 바인딩

CodeProject article 전환에

StackOver reference는 ObservableCollection에 CollectionChanged 이벤트와 삭제한다.

+0

안녕하세요, 그 답변은 나에게 올바른 힌트를주었습니다. 이제는 각 수업에 "삭제 된 항목 컬렉션"을 추가했습니다. 그런 다음 collectionChanged 이벤트를 사용하여 삭제 된 객체의 사본을 해당 collecion에 저장합니다. 이제 DELETE-Statement를 생성하기 위해 그것들을 사용할 수있었습니다. 나는 사건에 익숙하지 않았다. – Daniel