最低限の事しかしません。 そして、 動けば良し!レベル です。
制約に関しては、 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 件のコメント:
コメントを投稿