VB.net 2010で割り込み処理を共通化する方法

このQ&Aのポイント
  • VB.net 2010でプログラムを作成しています。同じコントロールを使う場合の処理を共通化したいです。
  • 現在は各データーグリッドビュー毎に処理していますが、一つの割り込み先にまとめたいです。
  • データーグリッドビューの違いを番号等で伝えてもらう方法も考慮しています。
回答を見る
  • ベストアンサー

VB.net2010  割り込みの共通化

VB.net 2010でプログラムを作成して居ます。 やりたい内容が同じで、同じコントロールを幾つか使う時、処理は共通にする事があると思います。 Case 1 sub_Std_Vlt_Dsp(0, frmMain.dgv_Std_100) '100Vの規格編集表示 Case 2 sub_Std_Vlt_Dsp(1, frmMain.dgv_Std_120) '120Vの規格編集表示 Case 3 sub_Std_Vlt_Dsp(2, frmMain.dgv_Std_200) '200Vの規格編集表示 この場合、sub_Std_Vlt_Dsp()は Sub sub_Std_Vlt_Dsp(ByVal iVolt As Integer, ByVal dgvList As System.Windows.Forms.DataGridView) '規格テーブルの編集/Edit of standars. '入力/Input   'iVolt as Integer 電圧ID/Voltage ID 'dgvList as DataGridView 表/List dgvList.Rows.Clear() '表示内容の初期化 'セルの設定 Setting of each cell dgvList.Columns(0).Width = 30 dgvList.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter dgvList.Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter この様に記述する事により、各々のデーターグリッドビューをdgvListとして処理出来ます。 そこで、割り込みの時なのですが、やはり複数のデーターグリッドビューのCellEndEditでの処理が同じなので、上記例の様に処理する事は可能でしょうか。 現在は各データーグリッドビュー毎に以下の様なコーディングをして居ます。 Private Sub dgv_Std_200_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_Std_200.CellEndEdit '電圧毎の規格編集処理 '0:規格命令 1:結果命令 2:倍率 3:符号(1:マイナス可) 4:表示(1:非表示) '5:単位 6:項目 7:最大値 8:最小値 bUpdItm = True '編集ありフラグTrue設定 btnStdUpdate.Enabled = True '更新ボタン利用可 btnStdCancel.Enabled = True '取り消しボタン利用可 Select Case e.ColumnIndex 'コラム別処理/Process by each column Case 0 '列0/Column 0 規格コマンド bStatus = fncChkHex(dgv_Std_200(0, e.RowIndex).Value, 0, 2) 'コマンド 空白か2桁のヘキサ文字 Case 1 '列1/Column 1 結果コマンド/Result command bStatus = fncChkHex(dgv_Std_200(1, e.RowIndex).Value, 0, 2) 'コマンド 空白か2桁のヘキサ文字 処理内容が各データーグリッドビュー同じなので一つの割り込み先にまとめたいと思っています。 上記の dgv_Std_200() を何らかの方法で他のデーターグリッドビューの時でも使える様にしたいのです。 なお、Handles の所に他のデーターグリッドビューのCellEndEditの飛び先を追加すれば、この割り込み処理に飛べる事は分つています。 直接先の例の様にコントロールの継承で無くても、例えばデーターグリッドビューの違いを番号等で伝えてもらつても構いません。 以前使って居たC++Builderは割り込み元のIDが取り込める様に成っていました。 どなたか、お分かりに成る方が居られましたらお教え下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

DataGridViewが異なるだけで、同じ処理を行うなら 下記のように、処理対象のDataGridViewを表す変数を宣言して その変数に対して処理を行えば、異なるDataGridViewのイベントを共通化出来ます。 Dim dgv As DataGridView = CType(sender, DataGridView)

TinyPine
質問者

お礼

ご回答有難うございました。 先ほどTextBoxを使って確認した所、動作しました。 明日、会社で実装してみたいと思います。 多分出来るとしたらsenderかeしか無いと思いその2っをネットで探していたのですが、CTypeなんですね。 ありがとうございました。

関連するQ&A

  • マルチスレッド[ VB.NET 2005 ]

    VB.NET 2005 VC++で作成した通信DLLをマルチスレッドで呼び出すプログラムを作成しています。 マルチスレッドについてご質問です。 ---------------------------------------------------------------- Private Sub ThreadMethod(ByVal aiIndex As UInt32) fSockInit() ← スレッドスタートなので別スレッドで動く End Sub '************************************************** ' フォームロード '************************************************** Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load wkThread(Index) = New Thread(New ThreadStart(AddressOf ThreadMethod)) wkThread(Index).Start() End Sub '************************************************** ' 接続ボタン押下 '************************************************** Private Sub btConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConnect.Click fConnect() ← スレッドを指定して動かしたい End Sub '************************************************** ' パラメータ設定ボタン押下 '************************************************** Private Sub btParm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btParm.Click fParmSet() ← スレッドを指定して動かしたい End Sub ---------------------------------------------------------------- 上記の例では、fSockInitはスレッド別に動作しますが、fConnect、fParmSetはメインスレッドで動作するようになっています。 frmMain_Loadで作成したスレッドを指定(※1)して関数を呼び出すことは出来ないのでしょうか? ※1.「クリックイベント(メインスレッド)→実行するスレッドを指定→関数呼び出し→メインスレッドに戻す」の様に。。。

  • イベント内で別イベントを呼ぶ方法

    早速質問させていただきます。 Form上にDataGridView(dgv)があります。 dgvのセルをマウスでダブルクリックした時に処理を入れております。 Private Sub dgv_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellDoubleClick   If e.RowIndex = -1 Then     Exit Sub   End If   '//処理 End Sub このdgv上でEnterキーを押した際に、ダブルクリックしたのと同じ処理を 行いたいのですが、このような場合、どのような実装をするのが一般的なのでしょうか? 例えば、下記の様にCall dgv_CellDoubleClick(sender, e)をするとEventArgsが合わないためエラーになってしまいます。 適切な方法をご教授お願い致します。 Private Sub dgv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown   If e.KeyCode = Keys.Enter Then     Call dgv_CellDoubleClick(sender, e)   End If End Sub

  • VBの Datagridview 行削除コード

    VB2010でコーディングしています。(VB初心者です。) ネットでDatagridview 行削除コードを調べてボタンに実装したんですが、一回目は削除できるんですが 二回目が削除できません。(削除後にデータを再構築できていない?) ご教授お願いします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DT As New DataTable DT = DirectCast(Me.DGV.DataSource, DataTable) Dim 削除 As Boolean = False '選択行の取得 For Each r As DataGridViewRow In Me.DGV.SelectedRows      Dim ID As String = DT.Rows(r.Index).Item("ID").ToString      (その他の処理) 'リスト上削除 Me.DGV.Rows.RemoveAt(r.Index) Next r End Sub

  • DataGridViewのセル編集完了後に値を設定するには

    VB.NETのDataGridViewについて質問です。 セル編集完了後に、編集した値が不正であるならその値をセル編集前に戻すというプログラムを作成しています。 しかし、現在値を正常に戻すことが出来ずに困っています。 現在は下記のように作成しています。 (1)CellBeginEditイベントを使用して、セル編集前の段階の値を「cellItem」変数に保存する (2)CellParsingイベントを使用して、保存した値で復元する。 (2)の段階で、下記の「cellItem」変数には値が入っているにも関わらず、セルに値が登録されていません。 尚、ボタンクリックイベント等で dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = cellItem を行うと、正常に値が登録されました。 セル編集完了後に値を戻すにはどのようにすれば良いのでしょうか? お分かりになる方がいらっしゃいましたら宜しくお願いします 'セル編集開始前 Private Sub dgv_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgv.CellBeginEdit cellItem = dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value End Sub 'セル編集完了後 Private Sub dgv_CellParsing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellParsingEventArgs) Handles dgv.CellParsing dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = cellItem End Sub

  • VB.NETで同一処理を実行させたい

    VB.NETでプログラム組んでいます。 下のように、あるフォームの中でメニューを設定して、メニューを選択すると処理を実行するようにしています。 Private Sub OpenMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenMenu.Click (オープンメニュークリック時の処理) End Sub このとき、同一フォームの中にツールバーを下のように設定して 上の(オープンメニュークリック時の処理)を実行させるには、 次の???の記述はどのようにすればよいのでしょう?。 (オープンメニュークリック時の処理)はかなり長い処理(関数(Private Sub Function)も含む)になってしまっているので、コピーして記述するのも嫌なのです。 普通に 「OpenMenu_Click()」 でよいのかと思っていましたが、引数(eでしょうか?)を設定しないとだめのようで、。 どのようにすればよいのかわかりません。すみませんが、ご教示ください。 Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick   ??? End Sub

  • Vb.NetでFor~Nextの使い方

    登録したデータの中から該当するID(データの頭2つ)を抜き出し、それを参照にLabel5と6に名前と所属のデータを表示させています。 該当データがない場合はLabel4に該当なしと表示します。 下の様に作ってみたのですが、どのIDを打っても名前と所属はちゃんと出るのですが、該当なしまで一緒に表示されます。 これはどこを変更したらいいのでしょうか? Public Class Form1 Dim data(9) As String Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Data(0) = "01山田 花子     デバイス部" 以下Data(9)まで続く・・       End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i = 0 To 9 If Mid(ShainData(i), 1, 2) = TextBox1.Text Then Label5.Text = Mid(Data(i), 3, 9) Label6.Text = Mid(Data(i), 13, 2) Else Label4.Text = "該当なし。" End If Next

  •  DataGridViewとHScrollBarのバーの幅を合わせる

     DataGridViewとHScrollBarのバーの幅を合わせる  今晩は,質問させていただきます.どうぞよろしくお願いいたします.  HScrollBarでDataGridViewを連動させております。 DataGridView内のセル幅の変更に伴いバーの大きさが変更された際、 HScrollBarのバーの大きさもこれと同じにしたいのでございますが、 どのプロパティにどの数字を入れてやればよいのかが分からず、 1ヶ月ほど悩んでおりますorz  ためしに↓のようにコーディングいたしましたが、、、   Private Sub DGV1_ColumnWidthChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) _     Handles DGV1.ColumnWidthChanged     With HScrollBar1       .Minimum = 0       .Maximum = (DGV1.Columns(0).Width + DGV1.Columns(1).Width _            + DGV1.Columns(2).Width + DGV1.Columns(3).Width _            + DGV1.Columns(4).Width + DGV1.Columns(5).Width)             '↑例えばColumnが0~5まである場合でございます。             'おそらく「.Maximum」に何か入れるのでは、、と              '推測している次第でございますが。。。     End With   End Sub ↑この場合、HScrollBarの幅がDataGridViewより小さくなったり してしまい、その状態のままHScrollBarを動かしてしまいますと、 DataGridViewを連動させることができずエラーになってしまいます。  以下、必要ないかもしれませんが、HScrollBarとDataGridViewを 連動させているコードでございます。   Private Sub HScrollBar1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _     Handles HScrollBar1.Scroll     DGV1.FirstDisplayedScrollingColumnIndex = e.NewValue       '↑ここでHScrollBarから大きい値が入ってしまい,       ' エラー「指定された引数は、有効な値の範囲にありません」になります。   End Sub  何かよい方法がございましたら,是非ともアドバイスいただきたくお願いいたします.  もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします.

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  • VB2008改行できません

    VB2008改行できません お願いします。 メロンパン 3個 240円 コロッケパン 2個 … という風にしたいのですが、 一行目が表示され、2行目の「コロッケパン」を入れた瞬間、 1行目が消え、 コロッケパンのみが表示されます。 なぜでしょうか。 正しいコードと、どのような理屈でそうなるのか頂けると嬉しいです。 Public Class Form1 Dim cm, a As String Dim kosu, en As Integer Private Sub ShapeComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShapeComboBox.SelectedIndexChanged cm = ShapeComboBox.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click kosu = TextBox1.Text Select Case ShapeComboBox.SelectedIndex Case 0 en = kosu * 120 Case 1 en = kosu * 180 Case 2 en = kosu * 240 End Select txtKaimono.Text = cm + kosu.ToString(" ##個") + en.ToString(" #,###円") + vbCrLf End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Application.Exit() End Sub End Class

  • VB電卓作成について

    今、Visual Studio NETを用いて電卓を作ろうとしています。 いろいろ調べてやっているのですが、うまくいきません。 1+2はできるのですが、1+2+3が5になってしまいます。 どうすればいいのか、どなたか教えていただけませんか? 今のコードをキーの設定以外を記載しておきます。 お願いします。 ================================================ Private Sub 数字キー(ByVal n As Integer) If CL Then R1 = 0 CL = False End If R1 = R1 * 10 + n Textreg.Text = R1 End Sub Private Sub 演算キー(ByVal o As Integer) Op = o R2 = R1 CL = True End Sub Private Sub 計算() Select Case Op Case 1 R1 = R2 + R1 Case 2 R1 = R2 - R1 Case 3 R1 = R2 * R1 Case 4 R1 = R2 \ R1 End Select Textreg.Text = R1 End Sub Private Sub keyEQ_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles keyEQ.Click 計算() End Sub Private Sub keyCL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles keyCL.Click Textreg.Text = "0" R1 = 0 R2 = 0 Op = 0 CL = True End Sub Private Sub Form電卓_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Textreg.Text = 0 R1 = 0 R2 = 0 Op = 0 CL = True End Sub End Class

専門家に質問してみよう