1


0

担当者の手順:

  1. .NETフォームアプリケーションの例を作成する

  2. フォームにTextBoxを配置する

  3. TextBoxのEnterイベントまで関数を配線する

このアプリケーションを実行すると、最初にTextBoxにフォーカスが移ったときに* Control.Enter *イベントが発生します。 ただし、クリックして別のアプリケーションに移動してから再度クリックしてテストアプリケーションに戻っても、イベントは発生しません。

そのため、*アプリケーション間を移動してもEnter / Leave *は起動されません。

私が使用できる別の代替の_Control-level_イベントがありますが、これはこのシナリオで発生しますか?

通常は* Form.Activated *を使用します。 残念ながら、私のコンポーネントは私に通知することなく私のコンポーネントを新しいフォームにドッキングすることができるドッキングシステムによってホストされているので、ここでは面倒です。

10 Answer


3


あなたはEnterイベントで何をやろうとしていますか?

私はあなたのサンプルプログラムで発生する他のコントロールレベルのイベントを見つけることができませんが、私のテストアプリがフォーカスを取り戻すとき、最後にフォーカスを持っていたコントロールはまだそれを持っています。

興味深い質問ですが、もう少し文脈が必要です。


1


例を試して、別のウィンドウ、デスクトップなどのコントロールの外側をクリックすると、GotイベントとLost Focusイベントが発生する可能性がありますが、フォームまたはコントロールが1つだけのコントロール内をクリックしようとした場合これらのイベントは、注目する唯一のものであるため、いつでも発生します。 ダイナミクスを変更したりコントロールをオーバーロードしたりしない限り、入力も終了もされませんが、これを実現することはできません。


0


あなたの例では、私はあなたが別のコントロールが必要だと思います。 その理由は、最初のコントロール(tabIndex 0)がフォーカスのあるコントロールだからです。 フォーカスを切り替える他のコントロールがないと、このコントロールは常にフォーカスされるため、入力できません。 別のアプリケーションやフォームに切り替えても、このフォームのフォーカスやアクティブコントロールは変更されません。そのため、戻ってもイベントは発生しません。

コントロールを追加するとcontrol.enteredは正常に動作するはずです。 これがあなたの唯一のコントロールであるならば、フォームがフォーカスを得たとき、なぜformLoadまたはTextChangedでイベントを呼ばないのですか?


0


ありがとう、背景をいくつか挙げます。

私のコントロールは、グリッドとツールバーを含むUserControlです。 ユーザーは通常、これらのコントロールのいくつかを起動して、システムのデータのさまざまなスライスを表示します。

現在のグリッドで選択した行からアクションを起動できるキーボードショートカットがいくつかあります。 しかしながら、これらのキーボードショートカットが現在フォーカスされているグリッドだけに適用されるのではないことが要件です。 ユーザーが現在アプリケーションの他の多くの領域の1つに焦点を合わせている場合、このキーボードショートカットはまだ機能するはずで、*最後にフォーカスされたグリッド*にルーティングされるはずです。

だから私は基本的にLastFocusedGrid = thisと言うように私のUserControlのControl.Enterイベントに関数を配線しました。

そしてドッキングとドッキング解除を除いて、それはうまくいくでしょう…​

これらのコントロールは、ビジュアルスタジオにやや似たドッキング機能を持つアプリケーション内でホストされています。

デフォルトでは、コントロールはアプリケーションのメイン作業領域内のタブとして起動します。これは、ビジュアルスタジオでソースファイルを開く方法と同じです。

ただし、ユーザーはタブヘッダーをつかんでメインアプリケーションからドラッグすることでタブを「切り取る」ことができます。 この時点で、アプリケーションはコントロールをホストするための新しい "floatフォーム"を作成します。 メインアプリケーションとこのフロートフォームの切り替えは、Control.EnterイベントとForm.Activatedイベントの目的のために、アプリケーションを切り替えるのと同じです。

その時点で、元の記事で説明したサンプルアプリケーションでシミュレートした「フォーム内の1つのコントロール」シナリオを作成しました。

今、これにはいくつかの方法があります。 Form.Activatedイベントを利用できます。これはフォームを切り替えるときに発生します。 テストアプリケーションのイベントをフォームのActivatedイベントに追加すると、それがうまく機能することがわかります。

問題は、私のUserControlとその親Formとの関係が流動的で、解決がやや複雑になることです。 うまくいった "this.ParentForm.Activated"まで配線してみました。 問題はいつこれを呼ぶのですか? あなたがアンドックされていない/やり直されたとき何が起こりますか? 私は古いフォームからフック解除できるように "previousParentForm"のようなものを含む厄介なコードの束になってしまいましたが、それでも親のフォームが変更されてもドッキングシステムから通知されないという問題に直面しました。それで私もそこでたくさんの変更をしなければならないだろう。

これらの問題は解決できないわけではありませんが、より単純なコントロールレベルの「親フォームがアクティブ化された」イベントがある場合は、それははるかに洗練されたものになります。

それはかなり長いです、しかし、私はそれが状況をはっきりさせると思います。


0


そのため、グリッドを作成するときには、KeyPressedやKeyUpなどを設定できません。 イベント? そうであれば、すべてのグリッドが同じイベントハンドラを利用できます。 イベントハンドラに入ったら、次のようにしてください。

グリッドcurrentGrid =(グリッド)送信者。

そうすれば、追跡することを心配せずに、送られてきたグリッドにそのコードブロックを適用できるはずです。

すべてのイベントハンドラが本当にそうであるので、それを実行するのに必要なすべてがアクセス可能である限りその位置は本当にミュートポイントです。


0


フライ、問題は、ユーザーがアプリケーション内のどこにいてもキーボードショートカットが機能するはずであることです。 それらは大まかなコマンドであり、トップレベルで処理されてから、「最後にフォーカスされたグリッド」にルーティングされます。

そのため、グリッドレベルでキーストロークを処理しても意味がありません。

具体的には、ユーザーがグリッドA、B、およびCを起動したとします。 しかし、彼は私のコードとは無関係の他のコントロールX、Y、およびZも起動します。

ユーザーがAをクリックしてからCをクリックします。 それから彼はYをクリックしてからZをクリックします。 Zに集中して、彼は私のキーボードショートカットを打ちます。 この場合、グリッドCはユーザーが最後に注目したグリッドであるため応答する必要があります。


0


あなたが持っている問題は、Enterイベントに直接関係しているわけではなく、もっと重要なことに関係しています。あなたが「コードとは関係ない」コントロールを持っているなら、あなたは本当にコントロールレベルのイベントを見ていません。


0


よく分からなかったと思います。

私のコントロールはコンテナアプリケーションにあります。 他のチームによる他の無関係なコントロールもそうしてください。 それはビジュアルスタジオのように考えてください - 私のコントロールはコード編集タブですが、ソースファイルと共存していますが直接関連していない保留中の変更リストとプロパティウィンドウもあります。

キーボードショートカットはコンテナアプリケーションによって処理されます。 それからそれはユーザーが焦点を当てていた私のコントロールの最後のものにルーティングされるべきです。

この "LastFocusedGrid"参照を維持することは、Enterイベントで私がしていることです。

あなたがビジュアルスタジオで仕事中に同様の機能を見たいならば、これを試してください:

  1. いくつかのソースファイルを開く

  2. [スタートページ]タブに移動します。

  3. Ctrl-Fを押して「現在の文書」を検索して文字列を探します。

  4. 検索機能がLAST FOCUSEDソースファイルに自動ナビゲートして検索を実行します。

そのため、あなたがソースファイルに集中していなくても、ctrl-Fコマンドはビジュアルスタジオによって処理され、そして最後に集中したソースファイルタブにルーティングされました。

Ctrl-Gで同じことを試してください。 あなたが直接ソースファイルに集中しない限り、それは機能しません。

私のキーボードコマンドは、ここではCtrl-Fのように動作する必要があります。Ctrl-Gのように動作する必要はありません。 だからこそ、私はキーボードイベントを直接自分のコントロールの中で捉えているのではありません。

それは物事を明確にしたり悪化させたりしますか?


0


単純なControl.GotFocusを試したことがありますか?


-2


この例では、テキストボックスのクリックを切り替えると、入力フォーカスも取得フォーカスも期待どおりに動作しませんが、代わりに子フォームをクリックした場合は両方とも期待どおりに動作します。

システムを使用する。 System.Collections.Genericを使用します。 System.Linqを使用します。 System.Windows.Formsを使用します。

namespace EnterBrokenExample {static class Program {/// ///アプリケーションのメインエントリポイント。 /// [STAThread] static void Main(){Application.EnableVisualStyles();} Application.SetCompatibleTextRenderingDefault(false);

フォームForm1 = new Form();フォームc1 = new Form();フォームc2 = new Form();

Form1.IsMdiContainer = true;

c1.MdiParent = Form1; c2.MdiParent = Form1;

c1.Show(); c2.Show();

TextBox tb1 = new TextBox(); c1.Controls.Add(tb1); tb1.Enter = ontbenter; tb1.Text = "Some Text"; tb1.GotFocus = ongotfocus;

TextBox tb2 = new TextBox(); c2.Controls.Add(tb2); tb2.Enter = ontbenter; tb2.Text = "その他のテキスト"; tb2.GotFocus = ongotfocus;

Application.Run(Form1); static void ontbenter(object sender、EventArgs args){if(!(送信者はTextBox))を返す。 TextBox s =(TextBox)送信者。 s.SelectAll(); }

static void ongotfocus(object sender、EventArgs args){if(!(senderはTextBox))を返す。 TextBox s =(TextBox)送信者。 s.SelectAll(); }}}