2016-11-27 11 views
0

私はC#を使用しているWindowsアプリケーションを持っています。私は、ユーザーがログインするロードフォームfrmMainを作成しました。顧客創造のようなユーザーのための4つのオプション、サプライヤー創造従業員の創造ユーザの作成ユーザーコントロールのフォーカスを維持Windowsアプリケーション

Situation exampleがあり

をこの正常に動作します。

問題はフォーカスで発生します。ユーザーがCustomerユーザーコントロールを読み込んでデータを入力すると、ユーザーが4番目のコントロール(Textbox/Comboboxまたは他のWindowsフォーム入力コントロール)のどこかにいて、突然CreateUserをクリックすると、コントロールロードはCreateUserになりますが、 Customerユーザコントロールの4番目の制御。

私が欲しいのは、現在のユーザーコントロールにフォーカスを置くことです。ユーザーコントロールが新しく読み込まれた場合は、デフォルトのコントロールにフォーカスを置きます。

私が使用していたコード、

// this method gets called if the form was opened earlier 
    private void ShowOpenForm(ControlItem _item) 
     { 
      try 
      { 
       //Get item from menu 
       ControlItem _menuI = null; 
       foreach (ToolStripmenuI menuI in tsmenuWindow.DropDownItems) 
       { 
        _menuI = (ControlItem)menuI.Tag; 
        if (_menuI.Control.Name.ToLower() == _item.Control.Name.ToLower()) 
        { 
         break; 
        } 
        _menuI = null; 
       } 
       if (_menuI != null) 
       { 
        WmenuI_ClearAllSelection(); 
        for (int index = 0; index < PnlUserCtrl.Controls.Count; index++) 
        { 
         Control ctl = PnlUserCtrl.Controls[index]; 
         if (ctl.Name.ToLower() == _menuI.Control.Name.ToLower()) 
         { 
          ctl.Visible = true; 
          ctl.BringToFront(); 


          break; 
         } 
        } 
        WmenuI_SetCurrentItemChecked(_menuI); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 









//User can navigate to opened items from menu as well 

    private void WindowMenuItem_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       ControlItem _item = (ControlItem)((ToolStripMenuItem)sender).Tag; 
       WmenuI_ClearAllSelection(); 
       for (int index = 0; index < PnlUserCtrl.Controls.Count; index++) 
       { 
        Control ctl = PnlUserCtrl.Controls[index]; 
        if (ctl.Name.ToLower() == _item.Control.Name.ToLower()) 
        { 
         ctl.Visible = true; 
         ctl.BringToFront(); 
         if (ctl is BaseControl) 
         { 
          ((BaseControl)ctl).SetFocus(); // This sets the focus to default textbox 
         } 

         break; 
        } 
       } 
       WmenuI_SetCurrentItemChecked(_item); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

しかし、デフォルトのテキストボックスに、このセットのフォーカスを確認してください。ユーザーが他のユーザーコントロールに移動した場所からの制御ではありません。

+1

ユーザーコントロールにフォーカスを設定するだけです。 UserControlは決してフォーカスを望んでいないので、自動的にフォーカスを最も低いTabIndexを持つコントロールに移動します。 –

答えて

0

より良い回答を得るために、質問にいくつかのコードを入力することをお勧めします。 SetFocus()メソッドを使用して、手動でフォーカスを手動で操作できます。あなたの質問については、タイプControlのオブジェクトを持つことができると思っています。それに焦点を当てたいデフォルトのコントロールに設定することができます。次に、コントロールのすべてのGotFocusメソッドを処理し、そのオブジェクトの値を設定します。 最後にフォーカスを復元したい場合は、[your object].SetFocus()に電話することができます。 これは単なるアイデアです。それが役立つかどうかを見てください。

+0

これはひどいアドバイスです。 GotFocusイベントハンドラ内でフォーカスを変更しないでください!これは、MSDNのドキュメントで明示的に呼び出されています。 –

+0

@CodyGrayあなたはそれをすべきだと誰が言ったのですか?私は焦点を当てた最後のアイテムを保持するためにフォーカスを得たオブジェクトを設定すると言った。その後、SetFocusは、create userによって引き起こされる別のイベントで呼び出されます。 – Emad

関連する問題