2016年10月6日木曜日

VB EF6 Entity Framework お試し 5 総括

動けば良し!レベル での VB.Net を使った Entity Framework 6 の DataGrid 版です。
今迄の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 件のコメント:

コメントを投稿