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