在C#中创建LostFocus事件后,GotFocus事件未到来

时间:2013-01-16 11:24:22

标签: c# events clipboard

如果我的表单LostFocus,我只想清除剪贴板文本。我的意思是,如果用户使用键盘或鼠标复制某些内容,必须在LostFocus个事件上清除它,那么如果我的表单再次获得焦点,我需要恢复我的文本。我怎样才能做到这一点?

string sValue = "";
public Form1()
{
    InitializeComponent();
    this.LostFocus += new EventHandler(Form1_LostFocus);
    this.GotFocus += new EventHandler(Form1_GotFocus);
}

void Form1_GotFocus(object sender, EventArgs e)
{
    Clipboard.SetText(sValue);
    textBox1.Text = Clipboard.GetText();
}

void Form1_LostFocus(object sender, EventArgs e)
{
    sValue = textBox1.Text;
    Clipboard.Clear();
}

这不起作用;调用LostFocus事件,但未调用GotFocus。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

为了给您一个有效的快速答案,而不是将事件处理程序添加到表单本身,将它们添加到TextBox控件:

textBox1.LostFocus += new EventHandler(Form1_LostFocus);
textBox1.GotFocus += new EventHandler(Form1_GotFocus);

如果表单包含任何可见控件,则永远不会触发GotFocusLostFocus事件。

但在表单级别处理此行为的推荐方法是使用:

this.Deactivate += new EventHandler(Form1_LostFocus);
this.Activated += new EventHandler(Form1_GotFocus);

textBox1.Leave += new EventHandler(Form1_LostFocus);
textBox1.Enter += new EventHandler(Form1_GotFocus);

微软说:

  1. Control.GotFocus Event

      

    GotFocus和LostFocus事件是低级焦点事件   绑定到WM_KILLFOCUS和WM_SETFOCUS Windows消息。通常情况下,   GotFocus和LostFocus事件仅在更新UICues时使用   或者在编写自定义控件时。而是进入和离开事件   应该用于除Form类之外的所有控件,它使用的是   已激活和停用活动。

  2. Form.Activated Event

      

    当应用程序处于活动状态且具有多个表单时,活动表单   是具有输入焦点的表单。不可见的表单不可能   积极的形式。激活可见表单的最简单方法是   单击它或使用适当的键盘组合。

  3. Control.Enter Event

      

    Form类会禁止Enter和Leave事件。该   Form类中的等效事件是Activated和Deactivate   事件

答案 1 :(得分:0)

    string sVal = "";
    public Form1()
    {
        InitializeComponent();
        this.Activated += new EventHandler(Form1_GotFocus);
        this.Deactivate += new EventHandler(Form1_LostFocus);

    }

    void Form1_LostFocus(object sender, EventArgs e)
    {
        sVal = Clipboard.GetText();
        Clipboard.Clear();
    }

    void Form1_GotFocus(object sender, EventArgs e)
    {
        Clipboard.SetText(sVal);
    }