|
分類:[VB.NET]
分類:[VB.NET]
DataGridにノード記号を出さないように実装して、MainテーブルとSubテーブルのレコードを削除するには?
vb.net 2003
どうかよろしければ、私の質問に答えてやってください。 (頑張って表現したつもりではありますが、この文章でうまく伝わるか不安・・)
次のような構造の2つのテーブルを使います。(KEY)は主キーです。 [TMAIN] ------ メインテーブル CODE_MAIN(KEY) F1 F2
[TDETAIL] ---- 詳細テーブル CODE_MAIN(KEY) CODE_SUB(KEY) F1 F2
フォームにデータグリッド[dgMain]を置いて、そこにはメインテーブル[TMAIN]を表示させます。 DataSource = DsMain1 DataMember = TMAIN
表示はうまく出来ました。
このときにグリッドの選択された行を削除するボタンを作ることが目的です。 ただし、 ・メインテーブルに関連して詳細テーブルのレコードも削除されること。 ・DataGridにノード記号[+]を出さないように実装すること。 この2つことを同時に満たしたいのです。
いろいろ考えた末、以下のようなコードが出来上がりました。 txtDetailCodeMain を隠しているのですが、もっと良い方法は無いものでしょうか?
よろしくお願いします。
---------------------------------- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load odaMain.Fill(DsMain1, "TMAIN") odaDetail.Fill(DsDetail1, "TDETAIL") ' 'odaDetail.Fill(DsMain1, "TDETAIL")
txtDetailCodeMain.Width = 0 dgMain.ReadOnly = True End Sub
Private Sub dgMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles dgMain.Paint '行選択 If Me.BindingContext(DsMain1, "TMAIN").Count > 0 Then dgMain.Select(dgMain.CurrentCell.RowNumber) End If End Sub
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click Dim i As Integer Dim mList1 As New ArrayList
Dim mList2 As New ArrayList
'選択されたデータグリッドのレコード番号をコレクションに保持 With dgMain Dim mCount As Integer = .BindingContext(.DataSource, .DataMember).Count '逆順に入れる For i = mCount - 1 To 0 Step -1 If .IsSelected(i) = True Then mList1.Add(i) 'グリッドのレコード番号 mList2.Add(.Item(i, 0)) 'CODE_MAIN End If Next i End With
If mList1.Count = 0 Then '//削除しない Exit Sub ElseIf MessageBox.Show("選択した " & mList1.Count.ToString & " 行を削除してもよろしいですか?" & vbCrLf & vbCrLf & _ "※注意)次のテーブルで該当するレコードが全て削除されます。 " & vbCrLf & vbCrLf & _ "メインテーブル" & vbTab & "[TMAIN]" & vbCrLf & _ "詳細テーブル" & vbTab & "[TDETAIL]" & vbCrLf & _ "" _ , "削除" _ , MessageBoxButtons.OKCancel _ , MessageBoxIcon.Question _ , MessageBoxDefaultButton.Button2) <> DialogResult.OK Then '//削除しない Exit Sub Else
'//削除処理 Do While mList1.Count '-------------------------------------------------------------------------------------------- 'メインテーブルポジション移動 Me.BindingContext(DsMain1, "TMAIN").Position = mList1(0)
'''-------------------------------------------------------------------------------------------- '''詳細テーブル削除(メインテーブル削除より先に実行する) ''Do While Me.BindingContext(DsMain1, "TMAIN.subMainDetail").Count > 0 '' Me.BindingContext(DsMain1, "TMAIN.subMainDetail").RemoveAt(0) ''Loop
'DsMain1の中にリレーションシップで、[TDETAIL] を入れると上記のコードでうまく削除できました。 'が、グリッド[dgMain]の左端に、[+]プラス記号が現れてしまいます。 ' 'これが嫌なので、もう一つのデータセット[DsDetail1]を作って下記のコードにしてみたら、 'うまく削除されました。 'でも、txtDetailCodeMain は、TDETAIL の CODE_MAIN を Bindingして隠したものです。 'もっと良い方法は無いものでしょうか?
'-------------------------------------------------------------------------------------------- '詳細テーブル削除 i = 0 Do While i < Me.BindingContext(DsDetail1, "TDETAIL").Count Me.BindingContext(DsDetail1, "TDETAIL").Position = i
If Not (mList2(0) = txtDetailCodeMain.Text) Then i += 1 Else Me.BindingContext(DsDetail1, "TDETAIL").RemoveAt(Me.BindingContext(DsDetail1, "TDETAIL").Position) End If Loop
'-------------------------------------------------------------------------------------------- 'メインテーブル削除 Me.BindingContext(DsMain1, "TMAIN").RemoveAt(Me.BindingContext(DsMain1, "TMAIN").Position) 'Me.BindingContext(DsMain1, "TMAIN").RemoveAt(mList1(0))
'-------------------------------------------------------------------------------------------- 'コレクションを削除 mList1.RemoveAt(0) mList2.RemoveAt(0) Loop
'再表示 odaMain.Update(DsMain1, "TMAIN") odaDetail.Update(DsDetail1, "TDETAIL") ' 'odaDetail.Update(DsMain1, "TDETAIL")
DsMain1.Clear() odaMain.Fill(DsMain1, "TMAIN") DsDetail1.Clear() ' odaDetail.Fill(DsDetail1, "TDETAIL") ' 'odaDetail.Fill(DsMain1, "TDETAIL") End If End Sub
|