今迄の4回のシリーズで書いて来た code を 総括 します。
WPF に慣れていない(M.V.VM Model でない) 動けば良し!レベル ですので、
そこの処は、何卒、お含み置き下さいます様に。
SQL Server の LocalDB で、 予め用意した Database ( .mdf ファイル ) を扱い、
VB.Net を使って、 Entity Framework 6 を試して見ました 的な投稿になります。
WPF の DataGrid を用意して、 これで操作を行うものです。
Visual Basic (Visual Studio 2013 Community Update 5) 上で 試しました。.
LocalDB も Entity Framework も WPF も 初心者レベルですので、 笑わないで下さい。
各 Framework が用意してくれる 基本的な Class を そのまま 使っており、
機能拡張の Class や、 M.V.VM Model の手法は取っていません。 それ故、動けば良し!レベル。
xmal 総括
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfAppEF6_DbFirstModel" mc:Ignorable="d" x:Class="MainWindow"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<CollectionViewSource x:Key="CameraViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Camera}, CreateList=True}"/>
</Window.Resources>
<Grid DataContext="{StaticResource CameraViewSource}">
<DataGrid x:Name="CameraDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Margin="60,40,60,80" ItemsSource="{Binding}" EnableRowVirtualization="True" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="CameCardColumn" Width="SizeToHeader" Header="Came Card" Binding="{Binding CameCard}"/>
<DataGridTextColumn x:Name="CameFullColumn" Width="SizeToHeader" Header="Came Full" Binding="{Binding CameFull}"/>
<DataGridTextColumn x:Name="CameIDColumn" Width="SizeToHeader" Header="Came ID" Binding="{Binding CameID}"/>
<DataGridTextColumn x:Name="CameNameColumn" Width="SizeToHeader" Header="Came Name" Binding="{Binding CameName}"/>
<DataGridTextColumn x:Name="CameNoColumn" Width="SizeToHeader" Header="Came No" Binding="{Binding CameNo}"/>
<DataGridTextColumn x:Name="CameRAWColumn" Width="SizeToHeader" Header="Came RAW" Binding="{Binding CameRAW}"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="Button1_Edit" Content="Edit/Show" HorizontalAlignment="Left" Margin="20,0,0,10" VerticalAlignment="Bottom" Width="75"/>
<TextBlock x:Name="TextBlock_Edit" HorizontalAlignment="Left" Margin="31,0,0,40" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Bottom"/>
<Button x:Name="Button2_Save" Content="Save" HorizontalAlignment="Left" Margin="416,0,0,10" VerticalAlignment="Bottom" Width="75"/>
<Button x:Name="Button3_Add" Content="Add" HorizontalAlignment="Left" Margin="158,0,0,10" VerticalAlignment="Bottom" Width="75"/>
<Button x:Name="Button4_Del" Content="Delete" HorizontalAlignment="Left" Margin="283,0,0,10" VerticalAlignment="Bottom" Width="75"/>
<TextBox x:Name="TextBox3_Add" HorizontalAlignment="Left" Height="23" Margin="158,0,0,35" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Bottom" Width="75"/>
<TextBox x:Name="TextBox4_Del" HorizontalAlignment="Left" Height="23" Margin="283,0,0,35" TextWrapping="Wrap" Text="{Binding CameID}" VerticalAlignment="Bottom" Width="75"/>
</Grid>
</Window>
Code VB 総括 改行に違い有り。.
Class MainWindow
Private myEntities As New PhotoDataEntities
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
'Dim CameraViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("CameraViewSource"), System.Windows.Data.CollectionViewSource)
'Load data by setting the CollectionViewSource.Source property:
'CameraViewSource.Source = [generic data source]
ReBindToDataGrid()
Me.CameraDataGrid.IsReadOnly = True
Me.TextBlock_Edit.Text = "Show"
Me.Button2_Save.IsEnabled = False
Me.Button3_Add.IsEnabled = False
Me.Button4_Del.IsEnabled = False
'DataGrid Deafult ReadOnly / PK AnyTime ReadOnly / Move To xaml OK
Me.CameraDataGrid.IsReadOnly = True
Me.CameIDColumn.IsReadOnly = True ' PK Column
'DataGrid Not Allow Add & Delete / Move To xaml OK
Me.CameraDataGrid.CanUserAddRows = False
Me.CameraDataGrid.CanUserDeleteRows = False
GetNewID()
End Sub
Private Sub MainWindow_Closing(sender As Object, e As ComponentModel.CancelEventArgs) Handles Me.Closing
myEntities.Dispose()
End Sub
Private Sub ReBindToDataGrid()
Dim CameraViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("CameraViewSource"), System.Windows.Data.CollectionViewSource)
'Load data by setting the CollectionViewSource.Source property:
'CameraViewSource.Source = [generic data source]
Dim query = From db In myEntities.Cameras Select db Order By db.CameNo
CameraViewSource.Source = query.ToList
GetNewID()
End Sub
Private Sub Button1_Edit_Click(sender As Object, e As RoutedEventArgs) Handles Button1_Edit.Click
Me.CameraDataGrid.IsReadOnly = Not Me.CameraDataGrid.IsReadOnly
Me.TextBlock_Edit.Text = IIf(Me.CameraDataGrid.IsReadOnly, "Show", "Edit")
Me.Button2_Save.IsEnabled = Not Me.CameraDataGrid.IsReadOnly
Me.Button3_Add.IsEnabled = Not Me.CameraDataGrid.IsReadOnly
Me.Button4_Del.IsEnabled = Not Me.CameraDataGrid.IsReadOnly
End Sub
Private Sub Button2_Save_Click(sender As Object, e As RoutedEventArgs) Handles Button2_Save.Click
myEntities.SaveChanges()
MessageBox.Show("Saved " & "Table : " & "Camera", Me.Title & " DB Save",
MessageBoxButton.OK, MessageBoxImage.Information)
End Sub
Private Sub Button3_Add_Click(sender As Object, e As RoutedEventArgs) Handles Button3_Add.Click
AddRec()
End Sub
Private Sub Button4_Del_Click(sender As Object, e As RoutedEventArgs) Handles Button4_Del.Click
DelRec()
End Sub
Private Sub AddRec()
Dim newRec As New Camera
newRec.CameID = Me.TextBox3_Add.Text
newRec.CameNo = CShort(Me.TextBox3_Add.Text.Substring(1)) 'ID Is Not ex. "c4b" (c + Num) / Allow Null
newRec.CameName = "*Edit*"
myEntities.Cameras.Local.Add(newRec)
myEntities.SaveChanges()
ReBindToDataGrid()
End Sub
Private Sub TextBox3_Add_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextBox3_Add.TextChanged
Dim chkRec As Camera = myEntities.Cameras.Find(Me.TextBox3_Add.Text)
If chkRec IsNot Nothing Then
Me.Button3_Add.IsEnabled = False
MessageBox.Show("Already Exist Key(CameID) = " & Me.TextBox3_Add.Text, Me.Title & " InputError")
ElseIf Me.CameraDataGrid.IsReadOnly = False Then
Me.Button3_Add.IsEnabled = True
End If
End Sub
Private Sub GetNewID()
Dim maxQuery = (From db In myEntities.Cameras Select db.CameNo Where CameNo < 90).Max
Dim newID As String = "c" & (maxQuery + 1).ToString
Me.TextBox3_Add.Text = newID
End Sub
Private Sub DelRec()
Dim delRecNowID As String = Me.TextBox4_Del.Text
Dim delRec As Camera = myEntities.Cameras.Find(Me.TextBox4_Del.Text)
myEntities.Cameras.Local.Remove(delRec)
myEntities.SaveChanges()
ReBindToDataGrid()
End Sub
End Class
変数名は Default のものから 変更している 場合があります。 詳細は後述のリンクを辿って下さい。.
また、 DataGrid の Column 名は、 Database の名称から自動生成されたものですので、ご注意下さい。
尚、 本来であれば、
入力データの検証は もっと ちゃんと するべき でしょうし、
行データ (Record) の コピー機能 や、
PK 値の変更機能 も 盛り込むべき なのかも知れません。
PK 値の変更は 追加 > 削除 の組み合わせで対応可能ですが、 機会を改めて少し書いて見様かと思っています。.
既投稿リンク
VB EF6 Entity Framework お試し 1 モデル作成
VB EF6 Entity Framework お試し 2 データソース作成
VB EF6 Entity Framework お試し 3 データ操作 表示
VB EF6 Entity Framework お試し 4 データ操作 更新
本来は、M.V.VM でちゃんと分離させるのでしょうが、 私には、その知識がありません。
もし、何方か、こう書くべきと言うのがあれば、コメント戴ければ幸いです。.
0 件のコメント:
コメントを投稿