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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

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

Q&A

解決済

2回答

12193閲覧

vb.net カスタムコントロールで作成したボタンからonClickでイベントを発生させたい

_ali

総合スコア14

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

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

0グッド

0クリップ

投稿2018/08/02 01:17

前提・実現したいこと

vb.netで電卓を作成しています。
電卓のボタンをクリックした時にフォーカスが発生してまうのを防ぐため、
フォーカスをとらないボタンを作成しました。
するとそれまで受け付けていたキー入力もうけとらなくなってしまいました。
調べたところ、PerformClick()を使っていることが原因だと判明し、OnClick()を使えばよいことがわかったのですが
どう継承してつかったらいいのかがわかりません。
初歩的な質問だと思うのですがよろしくお願い致します。

該当のソースコード

vb.net

1カスタムコントロール部分 2Public Class CustomControl1 3 Inherits Button 4 5 Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) 6 7 MyBase.OnPaint(e) 8 9 Me.SetStyle(ControlStyles.Selectable, False) 10 11 End Sub 12 13End Class 14 15フォーム部分  16''' <summary> 17 ''' キーボード割り当て 18 ''' </summary> 19 Public Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown 20 21 Select Case e.KeyCode 22 23 'Enterキー 24 Case Keys.Enter 25 26 btnEcho.PerformClick() 27 28 'BackSpaceキー 29 Case Keys.Back 30 31 btnBack.PerformClick() 32 33 'Deleteキー 34 Case Keys.Delete 35 36 btnCre.PerformClick() 37 38 '小数点キー 39 Case Keys.Decimal 40 41 btnDots.PerformClick() 42... 43 44--以下キー割り当てと電卓機能処理

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

visual studio 2013

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

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

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

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

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

guest

回答2

0

多分、ボタンを押した時にフォーカスがボタンに移動し、FormのKeyDownイベントが発生しなくなるという問題の回避のためにCustomControlを作成されたのだと思います。

そのようなことをしなくとも、FormのKeyPreviewプロパティをTrueにすれば
フォーム上のコントロールにフォーカスがあっても、FormのKeyDOwnイベントが発生します。

追記

UserControlに下記のようにPerformClickをオーバーロードしてやれば、UserControlのClickイベントが発生しました。

VB.NET

1Public Overloads Sub PerformClick() 2 MyBase.OnClick(New EventArgs) 3End Sub

投稿2018/08/02 01:37

編集2018/08/02 04:21
YAmaGNZ

総合スコア10222

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

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

_ali

2018/08/02 02:29

回答ありがとうございます。 確かにそうなのですが、その場合ボタンをクリックしたままエンターキーを押した時の動作がエンターキーに紐づけられたイベントではなく、ボタンに紐づけされたイベントが発生してしまいます。 この現象に対応するためにフォーカスをなくすという判断をしました。 普通に使っていればそんな使い方はしない思うのですが... そのため、フォーカスが当たっていなくてもイベントを発生させるonClick()を使用してみようということになりました。 説明不足ですみません。
YAmaGNZ

2018/08/02 03:16

すみません、少し整理させてください。 提示されたコードにて試してみましたがForm.KeyPrevew=Trueの状態で Form.KeyDownイベントが発生しましたが(EnterキーはKeyUpのみでした)、PerformClickをコールしてもClickイベントが発生しませんでした。 なので、UserControlの何かを呼び出し、Clickイベントを起こさせたいということでしょうか?
_ali

2018/08/02 04:09

おっしゃる通りです。 その状態でもキーを押したときにClickイベントを発生させたいということです。
guest

0

自己解決

回答ありがとうございました。
課題としては
・ボタンのフォーカスを無効にすること
・その状態でキーボード入力した時にフォームのボタンと同じ動作をすること
(フォーム上の+ボタンをクリックした時の動作 = キーから+を入力した時の動作)
でしたので、クリックした時とキーを入力した時とで同一のプロシージャを呼び出すことで、
自己解決致しました。
わかりにくい質問で申し訳ございません。

VB.net

1'キー入力判定 2Public Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown 3 4 Select Case e.KeyCode 5 6 '+キー 7 Case Keys.Add 8 9 Operator_Click("+") 10 11 End Case 12End Sub 13 14'ボタン入力判定 15''' <summary> 16 ''' 演算子ボタンが押されたら 17 ''' </summary> 18 Private Sub btnOperator_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 19 20 Dim btnOpe As Button = DirectCast(sender, Button) 'senderをButton型に変換 21 22 Operator_Click(btnOpe.Text) 23 24 End Sub 25 26'実際の処理 27''' <summary> 28 ''' 演算子処理 29 ''' </summary> 30 ''' <param name="strOpe">入力された演算子</param> 31 ''' <remarks></remarks> 32 Private Sub Operator_Click(ByVal strOpe As String) 33 34'演算子処理 略 35 36End Sub 37

投稿2018/08/02 09:59

_ali

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問