バックナンバー 第83号:VB2008 データベースプログラミング

VB 2008 Express Editiont と、SQL Server 2008 Express with Advanced Services を使って、フォームから入力した受注データを、受注ヘッダー表と受注ディテール表に登録する、受注伝票エントリープログラムを作成していきます。
受注伝票エントリー 第11回(選択行変更ボタンと完了ボタン)
第83号(2010.4.7発行)
====================================================================
       ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
           (VB 2008 Express & SQL Server 2008 Express)
--------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なサンプルプログラ
ムをお届けします。これからもよろしくお願いいたします。

やさしいVB2008 ADO.NET → http://adonetvb.com/index.html
====================================================================
                ■■ 受注伝票エントリー 第11回 ■■

フォームから入力した受注データを、受注ヘッダー表と受注ディテール表に
登録するプログラムを作成します。

フォーム    → http://adonetvb.com/OrderEntry/index.html

テーブル定義  → http://adonetvb.com/OrderEntry/DB.html

バックナンバー → http://adonetvb.com/MailMagazine/index.html

--------------------------------------------------------------------
              ■ 選択行変更ボタンと明細行変更完了ボタン ■

今回は、選択行変更ボタンクリック処理と明細行変更完了ボタンクリック処
理を実装します。

受注明細行を変更するときは、変更する行を選択後、選択行変更ボタンをク
リックします。
 ┌────────────────────────────┐
 │ 商品コード  商品名     数量   単価   金額│
 ├────────────────────────────┤
 │ 00001 商品00001   1  100  100│
 │ 00002 商品00002   2  200  400│

たとえば、1行目をクリックし、選択行変更ボタンをクリックすると、入力領
域に1行目のデータが表示されます。
    ┌―――――┐ ┌―――――――――――――┐
 商品 │00001│ │商品00001      │
    └―――――┘ └―――――――――――――┘

    ┌――┬―┐   ┌―――┐   ┌――――┐
 数量 │1 │▲│ 単価│100│ 金額│ 100│
    │  │▼│   └―――┘   └――――┘
    └――┴―┘

【選択行変更ボタンクリック処理】
フォーカス行は、CurrentRow.Indexプロパティでわかるので、この値を使っ
て、明細行を取得します。 変更する明細行のインデックス値は、変更後に
元の行に戻すために必要なので、Private変数updateMeisaiIndexに保存して
おきます。

  ' 選択明細行の取得
  Dim gyo As ClsInsertDetailRow
  gyo = meisaiList(DgvMeisai.CurrentRow.Index)
  ' 画面項目にセット
  TxtShohinCode.Text = gyo.ShohinCode
  NudSuryo.Value = gyo.JuchuSuryo
  LblShohinMeisho.Text = gyo.ShohinMeisho
  LblJuchuTanka.Text = CStr(gyo.JuchuTanka)
  LblJuchuKingaku.Text = CStr(gyo.JuchuKingaku)

  ' 変更行のインデックス保存
  updateMeisaiIndex = DgvMeisai.CurrentRow.Index


たとえば、品番を00005に、数量を5に変更して、明細行確認ボタンを押すと、
変更後のデータが表示されます。
    ┌―――――┐ ┌―――――――――――――┐
 商品 │00005│ │商品00005      │
    └―――――┘ └―――――――――――――┘

    ┌――┬―┐   ┌―――┐   ┌――――┐
 数量 │5 │▲│ 単価│500│ 金額│2500│
    │  │▼│   └―――┘   └――――┘
    └――┴―┘

そして、選択行変更完了ボタンを押すと、受注明細行リストとデータグリッ
ドビューに、変更後のデータが反映されます。
 ┌────────────────────────────┐
 │ 商品コード  商品名     数量   単価   金額│
 ├────────────────────────────┤
 │ 00005 商品00005   5  500 2500│
 │ 00002 商品00002   2  200  400│

【明細行変更完了ボタンクリック処理】
変更前の明細行を削除し、空の明細行を生成後、変更データをセットして、
元の位置に追加します。

  ' バインディングソースから変更前明細行を削除
  bindingSrc.RemoveAt(updateMeisaiIndex)

  ' 受注明細空行生成
  Dim dr As DataRow
  dr = ClsInsertDetailRow.CreateDataRow
  ' 入力データセット
  dr("商品コード") = TxtShohinCode.Text
  dr("受注数量") = NudSuryo.Value

  ' 変更行を明細行リストの元の位置に追加
  Dim gyo As New ClsInsertDetailRow(dr)
  bindingSrc.Insert(updateMeisaiIndex, gyo)


選択行変更ボタンクリック処理と明細行変更完了ボタンクリック処理を、
FormJuchuEntryクラスに追加します。

--【プログラムソースリスト:FormJuchuEntry.vb】---------------------

    ' 明細行リストの変更行インデックス
    Private updateMeisaiIndex As Integer

    '*******************************************************
    ' 選択行変更ボタンクリック処理
    '*******************************************************
    Private Sub BtnGyoHenko_Click _
        (ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles BtnGyoHenko.Click

        Try
            ' 選択明細行の取得
            Dim gyo As ClsInsertDetailRow
            gyo = meisaiList(DgvMeisai.CurrentRow.Index)
            ' 画面項目にセット
            TxtShohinCode.Text = gyo.ShohinCode
            NudSuryo.Value = gyo.JuchuSuryo
            LblShohinMeisho.Text = gyo.ShohinMeisho
            LblJuchuTanka.Text = CStr(gyo.JuchuTanka)
            LblJuchuKingaku.Text = CStr(gyo.JuchuKingaku)

            ' 変更行のインデックス保管
            updateMeisaiIndex = DgvMeisai.CurrentRow.Index

            ' 明細行変更完了ボタン押下可能
            BtnGyoHenkoKanryo.Enabled = True
            ' 明細行確認ボタン押下可能
            BtnGyoKakunin.Enabled = True
            ' 明細行追加ボタン押下不可
            BtnGyoTsuika.Enabled = False
            ' 選択行削除ボタン押下不可
            BtnGyoSakujo.Enabled = False
            ' 選択行変更ボタン押下不可
            BtnGyoHenko.Enabled = False

        Catch ex As Exception
            ' 例外が発生した時の処理
            MessageBox.Show(ex.ToString, "例外発生")

        End Try

    End Sub

    '*******************************************************
    ' 選択行変更完了ボタンクリック処理
    '*******************************************************
    Private Sub BtnGyoHenkouKanryo_Click _
        (ByVal sender As System.Object, _
         ByVal e As System.EventArgs) _
         Handles BtnGyoHenkoKanryo.Click

        Try
            ' バインディングソースから変更前明細行を削除
            bindingSrc.RemoveAt(updateMeisaiIndex)

            ' 受注明細空行生成
            Dim dr As DataRow
            dr = ClsInsertDetailRow.CreateDataRow
            ' 入力データセット
            dr("商品コード") = TxtShohinCode.Text
            dr("受注数量") = NudSuryo.Value

            ' 変更行を明細行リストの元の位置に追加
            Dim meisaiGyo As New ClsInsertDetailRow(dr)
            bindingSrc.Insert(updateMeisaiIndex, meisaiGyo)

            ' 受注合計金額を計算
            Dim sum As Integer = 0
            For i As Integer = 0 To meisaiList.Count - 1
                sum += meisaiList(i).JuchuKingaku
            Next
            LblGokeiKingaku.Text = sum.ToString("#,##0")

            ' 明細行クリア
            TxtShohinCode.Text = Nothing
            LblShohinMeisho.Text = Nothing
            NudSuryo.Value = 1
            LblJuchuTanka.Text = Nothing
            LblJuchuKingaku.Text = Nothing

            ' 商品コードにフォーカス
            TxtShohinCode.Focus()

            ' 明細行がある時のボタンの活性化
            If meisaiList.Count > 0 Then
                ' 選択行削除ボタン押下可能
                BtnGyoSakujo.Enabled = True
                ' 選択行変更ボタン押下可能
                BtnGyoHenko.Enabled = True
            End If

            ' 明細行変更完了ボタン押下不可
            BtnGyoHenkoKanryo.Enabled = False
            ' 明細行確認ボタン押下可能
            BtnGyoKakunin.Enabled = True
            ' 明細行追加ボタン押下可能
            BtnGyoTsuika.Enabled = True
            ' 選択行削除ボタン押下可能
            BtnGyoSakujo.Enabled = True
            ' 選択行変更ボタン押下可能
            BtnGyoHenko.Enabled = True

            ' 変更行のインデックスクリア
            updateMeisaiIndex = -1

        Catch ex As ShohinCodeException
            ' 商品コードエラー処理
            MessageBox.Show(ex.Message, "商品コードエラー")
            ' 商品コードにフォーカス
            TxtShohinCode.Focus()

        Catch ex As Exception
            ' その他例外が発生した時の処理
            MessageBox.Show(ex.ToString, "例外発生")

        End Try

    End Sub
--------------------------------------------------------------------
次号:選択行削除ボタンの実装です。

====================================================================
VB.NET データベースプログラミング奮闘記
  発行者:
          http://park5.wakwak.com/~weblab/
--------------------------------------------------------------------
このメールマガジン(マガジンID: 0000128094)は、
インターネットの本屋さん『まぐまぐ』から配信されています。
  http://www.mag2.com/ 

【購読中止の方法】購読の中止は次のホームページからお願い致します。
  http://park5.wakwak.com/~weblab/
  http://www.mag2.com/m/0000128094.htm
--------------------------------------------------------------------
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などのホームページで公開しているソースプログラム・データの利用により
生じた損害等については、発行者は一切責任を負いません。ソースプログラ
ムの再利用は自由です。著作権は発行者が所有します。
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================