2016年9月26日月曜日

VB EF6 Entity Framework お試し 4 データ操作 更新

VB EF6  Entity Framework お試し 3 データ操作 表示 で下準備した 各 Control に機能を実装します。
最低限の事しかしません。  そして、 動けば良し!レベル です。
制約に関しては、 Primary Key 制約のみ扱います。
本当なら、 xaml に色々書くのだと思いますが、 コードにガンガン書きます。  その点はご容赦を。


前回 の次に、
最初に行うのは、
DataGrid の ID (ここでは CameID / Primary Key 制約)欄 を編集出来なくする事 と、
その他の列の編集結果を 確定(同期 永続化)させる事 と、
追加削除機能を DataGrid から奪う事 と、 です。
そして、
編集確定後に、 ちゃんと保存したよ! と、 MessageBox で表示してあげます。  画面上の変化が無いので。
  何回も書きます、 動けば良し!レベル です。.

xmal 変更なし

Code VB 変更点
    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
        '... Add Next Lines ...

        '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

    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

さて、次に控えしは。  追加 にしますか。
新規行のデータ(初期値)を用意して、 DataGrid に加えます。
この後、  PK は編集出来ませんので、 TextBox に入れる値で PK 重複を確認する必要があります。
重複時には、その旨、 MessageBox で表示してあげます。  エラー表示ですね。
更に、追加のボタンを使わせない (isEnable=False) 事で、 Entity Framework の制限を逃げます。
どうせなら、最初から、何か Default 値を置いて置きますか。
  この例の場合、 PK は CameID で "c" + Number 2桁 ですが、 例外も取れる様に、 CameNo とは独立させています。
  c で始まる最大数に 1 加えたものを 初期値 にしましょう。  実際には CameNo<90 から値を作ります。
     今の処、例外は無いのですが、 
     例えば、 借り物のカメラに CameID="R1" or = "R2" CameNo=99 等と振る事が出来ます。
     PK の CameID は重複を許しませんが、 CameNo は重複を許します。
     つまり、89台の自前カメラが登録出来ます。  更に自分以外のものも登録して置けると。
     そして、以下のロジックでは、 CameNo=1~89 は c を頭に加えて CameID となり 固有番号となります。
更に、 他の作業後でも、 この PK 初期値を振り直す様にします。
また、 Null 不許容の 列 のみ、事前に値をセットします。

さて、コードは、

xmal 変更なし

Code VB 変更点
    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
        '... Add Next Lines ...

        GetNewID()
    End Sub

    Private Sub ReBindToDataGrid()
        '... Add Next Lines ...

        GetNewID()
    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

    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
End Class

さて、最後に、削除 です。
これは、 DataGrid で選択している 行 を消す事にしましょう。
ですから、 TextBox と DataGrid の PK 列 を Bind します。
xaml で書いています。
そして、コードに削除の処理を書きます。

xmal TextBox4_Del を変更
         <TextBox x:Name="TextBox4_Del" HorizontalAlignment="Left" Height="23" Margin="283,0,0,35" TextWrapping="Wrap" Text="{Binding CameID}" VerticalAlignment="Bottom" Width="75"/>
Code VB 変更点
    Private Sub Button4_Del_Click(sender As Object, e As RoutedEventArgs) Handles Button4_Del.Click
        DelRec()
    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

これで、一応、最低限のものが 出来上がり です。    でも、皆さん嫌いな 動けば良し!レベル (お勧め出来ない code)です。
そして、 DataGrid 上で、 Null と "" とは 区別がつきません。



尚、 これ迄の 総集編( code 纏め 全部 ) と 画面サンプル画像を 別投稿 にする予定です。  暫くお待ちを。
      VB EF6 Entity Framework お試し 5 総括
内容的には、 これ迄に書いて来たものと同じです。   追加の内容やレベルアップはありません。
動けば良し!レベル ですので ご注意を。
本来は、M.V.VM でちゃんと分離させるのでしょうが、 私には、その知識がありません。
もし、何方か、こう書くべきと言うのがあれば、コメント戴ければ幸いです。.



0 件のコメント:

コメントを投稿