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

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

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

6733閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/07/12 07:20

編集2020/07/12 07:50

前提・実現したいこと

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

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

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

該当のソースコード

VB

1セルダブルクリックのイベントです。こちらのコードをボタンクリックイベントにペーストすると上記のエラーが出ます。 2Dim dgv As DataGridView = DirectCast(sender, DataGridView) 3 Dim ODNOKBNN As String = CM0000.login_Pass 4 Dim ODNO As String = "" 5 Dim SGB As String = "" 6 Dim Syagai As String = "" 7 Dim MoveTime As String = "" 8 Dim SagyoPlace As String = "" 9 Dim StartTime As String = "" 10 Dim StopTime As String = "" 11 Dim BreakTime As String = "" 12 Dim Biko As String = "" 13 Dim Day As String = DateLabel.Text 14 15 If DataGridView1.Rows.Count = 0 Then 16 MessageBox.Show(msgE012, Text, MessageBoxButtons.OK, MessageBoxIcon.Error) 17 DataGridView1.Focus() 18 Else 19 For Each c As DataGridViewCell In DataGridView1.SelectedCells 20 ODNO = DataGridView1(0, c.RowIndex).Value 21 SGB = DataGridView1(2, c.RowIndex).Value 22 Syagai = DataGridView1(3, c.RowIndex).Value 23 MoveTime = DataGridView1(4, c.RowIndex).Value 24 SagyoPlace = DataGridView1(5, c.RowIndex).Value 25 StartTime = DataGridView1(6, c.RowIndex).Value 26 StopTime = DataGridView1(8, c.RowIndex).Value 27 BreakTime = DataGridView1(9, c.RowIndex).Value 28 Biko = DataGridView1(10, c.RowIndex).Value 29 Next 30 Dim T As TimeSpan = ToTimeSpan(StopTime) - ToTimeSpan(StartTime) - ToTimeSpan(MoveTime) - ToTimeSpan(BreakTime) 31 Dim SagyoTime As Double = T.TotalMinutes 32 Dim h As Double = SagyoTime \ 60 33 Dim m As Double = SagyoTime Mod 60 34 Dim hhmm As String = h.ToString() & ":" & m.ToString() 35 Dim result1 As String = EditTime(hhmm) 36 37 38 39 Dim query As String = "Insert into Test3 values (@ODNOKBNN,@ODNO,@SGB,@Syagai,@MoveTime,@SagyoPlace,@StartTime,@StopTime,@BreakTime,@SagyoTime,@Biko,@Day)" 40 Using con As SqlConnection = New SqlConnection("") 41 42 43 Using cmd As SqlCommand = New SqlCommand(query, con) 44 cmd.Parameters.AddWithValue("@ODNOKBNN", ODNOKBNN) 45 46 cmd.Parameters.AddWithValue("@ODNO", ODNO) 47 cmd.Parameters.AddWithValue("@SGB", SGB) 48 49 If Syagai = Nothing Then 50 cmd.Parameters.AddWithValue("@Syagai", "社内") 51 Else 52 cmd.Parameters.AddWithValue("@Syagai", Syagai) 53 End If 54 55 cmd.Parameters.AddWithValue("@MoveTime", MoveTime) 56 57 If SagyoPlace = Nothing Then 58 cmd.Parameters.AddWithValue("@SagyoPlace", "") 59 Else 60 cmd.Parameters.AddWithValue("@SagyoPlace", SagyoPlace) 61 End If 62 cmd.Parameters.AddWithValue("@StartTime", StartTime) 63 cmd.Parameters.AddWithValue("@StopTime", StopTime) 64 65 cmd.Parameters.AddWithValue("@BreakTime", BreakTime) 66 67 cmd.Parameters.AddWithValue("@SagyoTime", result1) 68 If Biko = Nothing Then 69 cmd.Parameters.AddWithValue("@Biko", "") 70 Else 71 cmd.Parameters.AddWithValue("@Biko", Biko) 72 End If 73 cmd.Parameters.AddWithValue("@Day", Day) 74 75 76 con.Open() 77 cmd.ExecuteNonQuery() 78 con.Close() 79 End Using 80 End Using 81 82 83 MessageBox.Show("登録完了", Me.Text) 84 End If 85 86 End Sub

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

Visual Studio2017,SQL Server

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

VB

1Dim dgv As DataGridView = DirectCast(sender, DataGridView)

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

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

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

VB

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

投稿2020/07/12 07:54

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/12 08:22

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

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 08:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/12 08:24

ありがとうございます! このようなチュートリアルがあると非常に助かります! これから作ってみようと思います!
guest

0

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

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

投稿2020/07/12 07:35

編集2020/07/12 07:36
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/12 07:41

回答ありがとうございます。 楽をせず、きちんとコードで実装したいと思います。 大変申し訳ございません。 イベントルーチンの方法があまりわかっておらず、教えていただけると幸いです。
y_waiwai

2020/07/12 07:47

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

退会済みユーザー

2020/07/12 07:51

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

2020/07/12 08:27 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問