質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

[VB.NET]DataGridViewでセルをダブルクリックして起こるイベントをDataGridView外のボタンクリックイベントに変更したい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 362
退会済みユーザー

退会済みユーザー

前提・実現したいこと

VisualBasicのDataGridViewのセルをダブルクリックするとDBにデータを登録するようにしているのですが、DataGridView外に配置しているボタンクリック時に同様のイベントを発生させたいです。

発生している問題・エラーメッセージ

同じコードをボタンクリックにペーストすると
System.InvalidCastException: '型 'System.Windows.Forms.Button' のオブジェクトを型 'System.Windows.Forms.DataGridView' にキャストできません。'

該当のソースコード

セルダブルクリックのイベントです。こちらのコードをボタンクリックイベントにペーストすると上記のエラーが出ます。
Dim dgv As DataGridView = DirectCast(sender, DataGridView)
        Dim ODNOKBNN As String = CM0000.login_Pass
        Dim ODNO As String = ""
        Dim SGB As String = ""
        Dim Syagai As String = ""
        Dim MoveTime As String = ""
        Dim SagyoPlace As String = ""
        Dim StartTime As String = ""
        Dim StopTime As String = ""
        Dim BreakTime As String = ""
        Dim Biko As String = ""
        Dim Day As String = DateLabel.Text

        If DataGridView1.Rows.Count = 0 Then
            MessageBox.Show(msgE012, Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
            DataGridView1.Focus()
        Else
            For Each c As DataGridViewCell In DataGridView1.SelectedCells
                ODNO = DataGridView1(0, c.RowIndex).Value
                SGB = DataGridView1(2, c.RowIndex).Value
                Syagai = DataGridView1(3, c.RowIndex).Value
                MoveTime = DataGridView1(4, c.RowIndex).Value
                SagyoPlace = DataGridView1(5, c.RowIndex).Value
                StartTime = DataGridView1(6, c.RowIndex).Value
                StopTime = DataGridView1(8, c.RowIndex).Value
                BreakTime = DataGridView1(9, c.RowIndex).Value
                Biko = DataGridView1(10, c.RowIndex).Value
            Next
            Dim T As TimeSpan = ToTimeSpan(StopTime) - ToTimeSpan(StartTime) - ToTimeSpan(MoveTime) - ToTimeSpan(BreakTime)
            Dim SagyoTime As Double = T.TotalMinutes
            Dim h As Double = SagyoTime \ 60
            Dim m As Double = SagyoTime Mod 60
            Dim hhmm As String = h.ToString() & ":" & m.ToString()
            Dim result1 As String = EditTime(hhmm)



            Dim query As String = "Insert into Test3 values (@ODNOKBNN,@ODNO,@SGB,@Syagai,@MoveTime,@SagyoPlace,@StartTime,@StopTime,@BreakTime,@SagyoTime,@Biko,@Day)"
            Using con As SqlConnection = New SqlConnection("")


                Using cmd As SqlCommand = New SqlCommand(query, con)
                    cmd.Parameters.AddWithValue("@ODNOKBNN", ODNOKBNN)

                    cmd.Parameters.AddWithValue("@ODNO", ODNO)
                    cmd.Parameters.AddWithValue("@SGB", SGB)

                    If Syagai = Nothing Then
                        cmd.Parameters.AddWithValue("@Syagai", "社内")
                    Else
                        cmd.Parameters.AddWithValue("@Syagai", Syagai)
                    End If

                    cmd.Parameters.AddWithValue("@MoveTime", MoveTime)

                    If SagyoPlace = Nothing Then
                        cmd.Parameters.AddWithValue("@SagyoPlace", "")
                    Else
                        cmd.Parameters.AddWithValue("@SagyoPlace", SagyoPlace)
                    End If
                    cmd.Parameters.AddWithValue("@StartTime", StartTime)
                    cmd.Parameters.AddWithValue("@StopTime", StopTime)

                    cmd.Parameters.AddWithValue("@BreakTime", BreakTime)

                    cmd.Parameters.AddWithValue("@SagyoTime", result1)
                    If Biko = Nothing Then
                        cmd.Parameters.AddWithValue("@Biko", "")
                    Else
                        cmd.Parameters.AddWithValue("@Biko", Biko)
                    End If
                    cmd.Parameters.AddWithValue("@Day", Day)


                    con.Open()
                    cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End Using


            MessageBox.Show("登録完了", Me.Text)
        End If

    End Sub

補足情報(FW/ツールのバージョンなど)

Visual Studio2017,SQL Server

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

ソース全体を細かく見たわけではないのですが、発生しているエラーは

Dim dgv As DataGridView = DirectCast(sender, DataGridView)


この処理の部分です。ボタンのクリックイベントハンドラにこの記述があるとエラーになります。

senderはざっくり言うとイベントを発生させたオブジェクトです。
元のコードではDataGridViewのダブルクリックなので、キャストするとちゃんとDataGridViewとして認識できますが、ボタンクリックのイベントでこのコードを実行しようとすると、sender(ボタン)をDataGridViewにキャストしようとしていることになりますので、エラーになってしまいます。

なので、ボタンクリックのイベントハンドラ内では、この部分を対象のDataGridViewになるように修正すればまずはエラーが消えると思います。

Dim dgv As DataGridView = Me.DataGridView ' 対象のDataGridView名で読み替えてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 17:22

    回答ありがとうございます。
    試した結果、ボタンクリックにイベントを実装することが出来ました!
    ありがとうございます!

    キャンセル

0

そのDataGridViewのイベントルーチンで、そのボタンをクリックするなり、クリックイベントを実行するなりすればいいです

コピペで済ませようとせず、自分でコード書きましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 16:41

    回答ありがとうございます。
    楽をせず、きちんとコードで実装したいと思います。

    大変申し訳ございません。
    イベントルーチンの方法があまりわかっておらず、教えていただけると幸いです。

    キャンセル

  • 2020/07/12 16:47

    まずはそのボタンをクリックしたら、DBにデータを登録するようにしましょう。
    それができないとおはなしになりません

    キャンセル

  • 2020/07/12 16:51

    DBに登録するよう実装しました!

    キャンセル

  • 2020/07/12 17:27 編集

    なら、ダブルクリックイベントで、ボタン.OnClickメソッドを実行させてやればいいです

    キャンセル

0

今のやり方を大幅に変えることになるので回答とは言い難いですが・・・

できれば一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

DB が SQL Server の場合ですが、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://docs.microsoft.com/ja-jp/previous-versions/0f92s97z(v=vs.120)

10 行でズバリ !! 非接続型のデータ アクセス
https://github.com/microsoftarchive/msdn-code-gallery-community-0-9-non-alphabetic/tree/master/10%20%E8%A1%8C%E3%81%A7%E3%82%BA%E3%83%90%E3%83%AA%20!!%20%E9%9D%9E%E6%8E%A5%E7%B6%9A%E5%9E%8B%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%20%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%20%28ADO.NET%29%20%28VB%29

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

上に紹介した後者のチュートリアルは 2 つのテーブルを階層更新するために少々複雑になっていますが、単一テーブルですと前者のチュートリアルのように非常に簡単で、操作に慣れると以下のようなアプリが 5 分もかからず作れるはずです。

イメージ説明

新規レコードの登録は、上の画像で + ボタンをクリックすると空の新しい行が表示されるのでそれに入力し、フロッピーディスクのアイコンをクリックすれば SQL Server のテーブルに結果が反映されます。削除、変更ももちろん可能です。

自力で一からコードを書く場合のような種々の問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 17:24

    ありがとうございます!
    このようなチュートリアルがあると非常に助かります!

    これから作ってみようと思います!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • SQL Serverに関する質問
  • [VB.NET]DataGridViewでセルをダブルクリックして起こるイベントをDataGridView外のボタンクリックイベントに変更したい。