4

ビジーなフォームの多くのコントロールにキーダウン ハンドラーを設定するより良い方法はありますか? (フォームハンドラーを単独で使用すると、場合によっては機能しません。)

Private Sub rText_KeyDown(ByVal Sender As Object, ByVal e As KeyEventArgs) Handles rText0.KeyDown, txTaxon.KeyDown, txCommon.KeyDown, _
  txConfidence.KeyDown, txDate.KeyDown, txDateAdded.KeyDown, txFileName.KeyDown, txGPS.KeyDown, txRating.KeyDown, _
  txConfidence.KeyDown, txQuality.KeyDown, txRemarks.KeyDown, txKeyWords.KeyDown, txOriginalPath.KeyDown, txDateAdded.KeyDown, _
  txLink.KeyDown, chkLink.KeyDown, rview.KeyDown, cmdNext.KeyDown, tvTaxon.KeyDown, Me.KeyDown, _
  cmdTaxon.KeyDown
Call globalkey(e)
End Sub
4

2 に答える 2

2

私はC#プログラマーなので、(vb.netコードのように)実用的なソリューションを提供することはできません。

以下のことを行うことで、これを機能させることができると思います。

  1. プロパティに特定の値が設定されている場合に限り、それぞれのコントロールに対してAddHandlerを使用するメソッドを作成します(詳細は以下の手順2を参照してください)。
  2. 共通のハンドラーをアタッチするすべてのコントロールは、Tagプロパティを一意の値に設定します(例: 。) "KeyDown"Enumこの場合、代わりに使用することをお勧めしますstring
  3. さて、Formコンストラクターで、InitializeComponent呼び出した後、上記の#1で書いたメソッドを呼び出します。これにより、必要なすべてのコントロールにハンドラーがアタッチされます。
  4. この要件を持つ複数のフォームがある場合は、この機能をメインフォームに追加できます。メインフォームは、他のすべての親のように機能します(継承)

私が十分に明確であり、これが役立つことを願っています。

于 2012-10-01T08:04:39.680 に答える
2

私はAYKの答えが好きです。次のような関数を使用できます。

Public Shared Function GetAllControlsRecurs(ByVal list As List(Of Control), _
  ByVal parent  As Control, ByVal ctrlType As System.Type) As List(Of Control)
    If Parent Is Nothing Then Return list
    If Parent.GetType Is ctrlType Then
        list.Add(Parent)
    End If
    For Each child As Control In Parent.Controls
        GetAllControlsRecurs(list, child, ctrlType)
    Next
    Return list
End Function

これは、親コントロールの特定のタイプのすべてのコントロール (コントロール内のコントロールを含む) を取得する便利な関数です。AYK が提案したようにコントロールにタグを付けることにより (つまりTag、デザイナーでプロパティを設定する)、上記のすべてのコントロールを実行し、プログラムでハンドラーを追加できます (おそらくコンストラクターで)。

Dim textboxList As New List(Of Control)

For Each ctl As TextBox In GetAllControlsRecurs(textboxList, Me, GetType(TextBox))
    If ctl.Tag = MyTags.rTextKD then 
        AddHandler ctl.KeyDown, AddressOf rText_KeyDown
    End If
Next

MyTags実装する一般的なハンドラーのリストを含む列挙型として定義できる場所。ここrTextKDに列挙型のメンバーがあります(回答ではここで定義していません)。このアプローチの優れた点は、拡張可能であることです。新しいコントロールを追加してタグを付けると、このコードがそれを取得し、変更する必要なくハンドラーをフックします。

上記はあなたの直接の質問に対する回答ですが、グローバルなホットキーを作成しようとしている場合、これはその方法ではありません。ハンスがコメントで提供したリンクは、おそらくあなたが行きたい場所です。

于 2012-10-01T11:03:43.297 に答える