ここで、テキストボックスに「Enter」キーストロークをキャプチャし、ボタンを押すように使用するには、フォームのKeyPreviewプロパティをtrueに設定し、KeyDownの値を確認する必要があることを他の場所で読みました。
それぞれが異なるボタンに関連付けられているいくつかのTextBoxコントロールでこの機能を使用できるようにしたいと思います。
私の質問は、どのコントロールがKeyPressイベントを引き起こしたかをどうやって知るのですか?送信者はフォーム自体としてリストされます。
G
動作しているように見える解決策を見つけました。
private void DeviceForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && tstxtDeviceFilter.Focused)
{
filterByDeviceSN();
}
}
仕方がないのですが、もっと良い方法があるに違いないと思います!
-編集-編集-編集-編集-編集-
さて、以下の提案を見て(ありがとう)、私はこの状況で私にとって「より良い」方法を見つけました。
this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown);
private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
filterByDeviceSN();
}
}
明らかに、フォームではなくテキストボックス自体にイベントをトラップすることで、フォーカスについて心配する必要はありません。もう一度、そんなに長い間考えていなかったのは馬鹿げています!
各フォームには、「承認」ボタンと「キャンセル」ボタンのプロパティがあります。これらは、ユーザーがそれぞれEnterキーとEscキーを押したときに「クリック」されるボタンです。
各コントロールがフォーカスを取得するときにデフォルトのボタンを変更できます(ボタンごとに1つのフォーカスイベントハンドラーを取得し、それを一連のテキストボックスと共有できます)
これを行うと、ボタンの外観が変化し、どのボタンがデフォルトであるかをユーザーに視覚的に知らせます。
または、これを実行したくない場合は、「ActiveControl」プロパティを使用して、それがどのテキストボックスのセットに属しているかをテストして確認できます。
これらのテキストボックスの1つでない場合、デフォルトのボタンはどうあるべきか、自問しましたか?
Form.ActiveControl を試しましたか?
このコードを開始点として使用して、フォームのキーダウンイベントをキャプチャできます。 ActiveControlは、焦点を当てているものです。この例では、フォーム上の異なるTextBoxにいるときに、「Enter」に他のアクションを追加するための柔軟性があります。 VB.NETですが、C#に簡単に変換できるはずです。
Private Sub MyForm_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Enter Then
If Me.ActiveControl.Name = Me.TextBox1.Name Then
' This is the TextBox we want to be active to run filterByDeviceSN()
filterByDeviceSN()
ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then
foo()
End If
End If
End Sub