0

私はいくつかのフォームを持つソリューションを持っています。それぞれに TextBox の/コントロールと、SIP を表示するためのボタンがあります (下部のバーは非表示になっています)。

ユーザーが SIP ボタンをクリックすると、SIP は有効になりますが、フォーカスはボタンになります。ユーザーにボタンをクリックしてもらいたい - SIP が表示されますが、ユーザーがボタンをクリックする前にフォーカスを持っていたコントロールにフォーカスが残ります。誰もこれを行う方法を知っていますか? ありがとう。

4

2 に答える 2

1

標準のボタンを使用する代わりに、Control クラスから派生させて OnPaint メソッドをオーバーライドすることにより、カスタム ボタンを作成できます。この方法で作成されたコントロールは、Click イベントを処理するときにデフォルトでフォーカスを要求しません (VS2008 netcf 2.0 でテスト済み)。

public partial class MyCustomButton : Control
{
    public MyCustomButton()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        pe.Graphics.DrawString("Show SIP", Font, new SolidBrush(ForeColor), 0, 0);
        // Calling the base class OnPaint
        base.OnPaint(pe);
    }
}
于 2012-10-31T13:49:52.430 に答える
0

nathan のソリューションは、Compact Framework またはネイティブの Windows Mobile アプリケーションでも機能します。テキスト ボックス GotFocus でグローバル var を設定し、これをボタン クリック イベントで使用して、フォーカスを最後のアクティブなテキスト ボックスに戻します。

    //global var
    TextBox currentTB = null;
    private void button1_Click(object sender, EventArgs e)
    {
        inputPanel1.Enabled = !inputPanel1.Enabled;
        if(currentTB!=null)
            currentTB.Focus();
    }

    private void textBox1_GotFocus(object sender, EventArgs e)
    {
        currentTB = (TextBox)sender;
    }

よろしく

ヨーゼフ

編集: TextBox のサブクラスを使用したソリューション:

class TextBoxIM: TextBox{
    public static TextBox tb;
    protected override void OnGotFocus (EventArgs e)
    {
        tb=this;
        base.OnGotFocus (e);
    }
}
...
private void btnOK_Click (object sender, System.EventArgs e)
{    
    string sName="";
    foreach(Control c in this.Controls){
        if (c.GetType()==typeof(TextBoxIM)){
            sName=c.Name;
            break; //we only need one instance to get the value
        }
    }
    MessageBox.Show("Last textbox='"+sName+"'");
    }

次に、TextBox を配置する代わりに、TextBoxIM を使用します。

于 2012-10-31T09:13:33.620 に答える