加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在处理多个文本框的get和lost焦点事件时,重复事件调用和焦

发布时间:2020-12-15 20:03:57 所属栏目:百科 来源:网络整理
导读:以下是我的代码,用于处理表单中可用的所有文本框的gotfocus和lostfocus事件. private void Form1_Load(object sender,EventArgs e) { foreach (Control c in this.Controls) { if (c is TextBox) { c.GotFocus += new System.EventHandler(this.txtGotFocus)
以下是我的代码,用于处理表单中可用的所有文本框的gotfocus和lostfocus事件.

private void Form1_Load(object sender,EventArgs e)
    {

        foreach (Control c in this.Controls)
        {
            if (c is TextBox)
            {
                c.GotFocus += new System.EventHandler(this.txtGotFocus);
                c.LostFocus += new System.EventHandler(this.txtLostfocus);
            }
        }
    }
    private void txtGotFocus(object sender,EventArgs e)
    {
        TextBox tb = (TextBox)sender;
        if (tb != null)
        {
            tb.BackColor = Color.Silver;
            tb.BorderStyle = BorderStyle.FixedSingle;
        }

    }
    private void txtLostFocus(object sender,EventArgs e)
    {

        TextBox tb = (TextBox)sender;
        if (tb != null)
        {
            tb.BackColor = Color.White;
            tb.BorderStyle = BorderStyle.Fixed3D;
        }
    }

它可以在第一个文本框中正常工作,但是当我按Tab键转到下一个文本框时,它将重复调用这两个事件,文本框的行为就像闪烁一样.一段时间后错误信息显示在代码中:

A callback was made on a garbage collected delegate of type ‘System.Windows.Forms!System.Windows.Forms.NativeMethods+WndProc::Invoke’. This may cause application crashes,corruption and data loss. When passing delegates to unmanaged code,they must be kept alive by the managed application until it is guaranteed that they will never be called.

代码有什么问题?有什么解决方案吗?

解决方法

c.LostFocus += new System.EventHandler(this.txtLostfocus);

LostFocus是一个危险的事件,Control.LostFocus的MSDN Library文章警告这一点,强烈建议使用Leave事件.您可以在设计器中看到这一点,在表单上放置一个TextBox,然后单击“属性”窗口中的闪电图标.请注意GotFocus和LostFocus事件都不可见.您必须改为使用Enter和Leave事件.

关于这里发生了什么的一些背景知识.您的程序会因为分配BorderStyle属性而爆炸.这是一个“困难”属性,它会影响窗口的样式标志,即传递给本机CreateWindowEx()函数的标志.因此,更改边框样式需要Winforms再次创建本机窗口.这就是导致你看到闪烁的原因,文本框被破坏并重新创建,然后重新绘制.你看到了.

但是它具有超出闪烁的副作用,它还会导致低级别的GotFocus和LostFocus事件被触发.因为被破坏的窗户当然也失去了焦点.由于LostFocus事件处理程序再次更改BorderStyle,因此会在程序中进行非常差的交互,从而迫使Winforms再次重新创建窗口.并触发GotFocus事件,您再次更改BorderStyle.这反复重复,你看到文本框快速闪烁.这不会无休止地进行,在创建窗口10,000次之后,操作系统会拔出插件并且不会让程序再创建另一个.窗口程序的严重崩溃是结果.

对于Enter和Leave事件没有问题,它们不能从低级Windows通知中工作,因此在重新创建文本框窗口时不要触发.你只能通过不改变BorderStyle属性来摆脱一次性闪烁,如果它仍然困扰你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读