DataGridViewでのKeypressイベントのセル計算について

タグの編集
投稿者 えふ  (社会人) 投稿日時 2009/9/24 18:55:39
連休明けで申し訳ありませんが教えて下さい。連休前からずっと悩んでいます。

Form上でデータとの連結をさせずにひとまず画面上だけで操作を考えているところです。

DataGridviewにてセルのKeypressイベントにて入力中の数量を単価と掛けて金額に自動表示させたいの
ですかKeypressイベントにて取得する数量が前回に入力したものとなってしまいます。現在入力中のものを
取得するにはどうすればよいのでしょうか?教えて下さい。
現状では下記のようにしております。

下記にてKeyPressイベントの「数量の取得」の「DataGridView01(3, Active_Row).Value」で現在入力中
でなく前回の入力を取得してしまします。通常ならばEnterキーにて計算させるのですがEnterキーにして
も同じ現象となります。


DataGridviewにてDataGridview01に左側より 商品コード、商品名、数量、単位、単価、金額の列を作成します。data
        
 '[From loadにて]
    '初期列数の設定
        DataGridView01.ColumnCount = 6
        DataGridView01.Columns(0).Name = "商品コード"
        DataGridView01.Columns(1).Name = "商品名"
       DataGridView01.Columns(2).Name = "単位"
        DataGridView01.Columns(3).Name = "数量"
       DataGridView01.Columns(4).Name = "単価"
       DataGridView01.Columns(5).Name = "金額"

  '[CellBeginEditイベントハンドラ]
      Private Sub DataGridView01_CellBeginEdit(ByVal sender As Object, _
             ByVal e As DataGridViewCellCancelEventArgs) _
             Handles DataGridView01.CellBeginEdit
        
             Dim dgv As DataGridView = CType(sender, DataGridView)
             '単価列・金額列を編集不可とする。
               Select Case dgv.Columns(e.ColumnIndex).Name
                    Case "単価"
                             e.Cancel = True
                    Case "金額"
                             e.Cancel = True
             End Select
       End Sub

  '[EditingControlShowingイベントハンドラ]
      Private Sub DataGridView01_EditingControlShowing(ByVal sender As Object, _
                            ByVal e As DataGridViewEditingControlShowingEventArgs) _
                            Handles DataGridView01.EditingControlShowing

        '-----もしDataGridViewTextBoxEditingControlであれば・・・
           If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then

             Dim dgv As DataGridView = CType(sender, DataGridView)
             '----1) 編集のために表示されているテキストボックスコントロールを取得します。
               Dim tb As DataGridViewTextBoxEditingControl = _
                     CType(e.Control, DataGridViewTextBoxEditingControl)

             '----2) 同じイベントハンドラが同じテキストボックスのイベントに何回も追加され
               '       ないようにEditingControlShowingイベントハンドラでイベントハンドラを
               '       削除します。
               RemoveHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress

             '---3) キーイベントを発生(数量列、単価列)
               Select Case dgv.CurrentCell.OwningColumn.Name
                Case "数量"
                    AddHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress
             End Select
          End If
       End Sub
 
  '[KeyPressイベントハンドラ]
       Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _
            ByVal e As KeyPressEventArgs) Handles DataGridView01.KeyPress
 
            Dim wk_suryo As Decimal = 0
            Dim Wk_tanka As Decimal = 0

            If e.KeyChar < "0"c Or e.KeyChar > "9"c Then
               e.Handled = True '--数字しか入力できないようにする
              End If

            '現在のセル位置(列、行)の取得
            Active_Row = DataGridView01.CurrentCell.RowIndex
            Select Case DataGridView01.Columns(Active_Col).Name
              Case "数量"
                 '数量の取得
                 If Trim(DataGridView01(3, Active_Row).Value) = "" Then
                    wk_suryo = 0
                 Else
                    wk_suryo = DataGridView01(3, Active_Row).Value
                 End If
                 '単価の取得
                 If Trim(DataGridView01(5, Active_Row).Value) = "" Then
                    Wk_tanka = 0
                 Else
                    Wk_tanka = DataGridView01(5, Active_Row).Value
                 End If
                 '金額列の計算
                 DataGridView01(6, Active_Row).Value = wk_suryo * Wk_tanka
              Case Else
            End Select
       End Sub

すいませんがよろしくお願いします。   
投稿者 えふ  (社会人) 投稿日時 2009/9/24 19:53:58
下記イベントにて編集後に計算できましたが これでも大丈夫でしょうか?
  Private Sub DataGridView01_CellEndEdit( _
   ByVal sender As Object, _
   ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
   Handles DataGridView01.CellEndEdit



      Dim wk_suryo As Decimal = 0
      Dim Wk_tanka As Decimal = 0
      Select Case DataGridView01.Columns(Active_Col).Name
            Case "数量"
              If Trim(DataGridView01(Active_Col, Active_Row).Value) = "" Then
                wk_suryo = 0
              Else
                wk_suryo = DataGridView01(Active_Col, Active_Row).Value
             End If
              If Trim(DataGridView01(Active_Col + 2, Active_Row).Value) = "" Then
                 Wk_tanka = 0
              Else
                 Wk_tanka = DataGridView01(Active_Col + 2, Active_Row).Value
              End If
              DataGridView01(Active_Col + 3, Active_Row).Value = wk_suryo * Wk_tanka
            Case Else
     End Select
    End Sub