C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataGridにノード記号を出さないように実装して、MainテーブルとSubテーブルのレコードを削除するには?


(過去ログ 5 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■5110 / inTopicNo.1)  DataGridにノード記号を出さないように実装して、MainテーブルとSubテーブルのレコードを削除するには?
  
□投稿者/ ねっとかふぇ常連 二等兵(1回)-(2006/07/25(Tue) 19:19:50)

分類:[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


0
引用返信 編集キー/
■5130 / inTopicNo.2)  Re[1]: DataGridにノード記号を出さない
□投稿者/ 特攻隊長まるるう 一等兵(22回)-(2006/07/26(Wed) 17:45:28)

分類:[VB.NET] 

No5110に返信(ねっとかふぇ常連さんの記事)
dgMain.DataSource に DsMain1.Tables("TMAIN") を設定すればいいだけでは?

もしくは、
CaptionVisible、ParentRowsVisible あたりを False にして"TMAIN"に NavigateTo
しておけばいいように思います。


0
引用返信 編集キー/
■5145 / inTopicNo.3)  Re[2]: DataGridにノード記号を出さない
□投稿者/ ねっとかふぇ常連 二等兵(2回)-(2006/07/27(Thu) 18:51:10)

分類:[VB.NET] 

No5130に返信(特攻隊長まるるうさんの記事)

特攻隊長まるるうさん、ありがとうございます。

教えていただいた方法を試してみましたが、私の力ではノード記号は表示されたままでした。
この方法ももう少し自分で試行錯誤してみようと思います。



特攻隊長まるるうさん も注目されたので、やはりプロパティにそのような機能があるのでは?と思い、

再度調べてみると・・・

AllowNavigation を False にするだけでした。お騒がせしました。




あと、質問とは関係ないのですが、
ヘッダーでソートした後にも、きちんと選択したものが削除できるように、
次のように修正しました。

'変更前
mList1.Add(i) 'グリッドのレコード番号

'変更後
mList1.Add(i.ToString) 'グリッドのレコード番号



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -