当MouseEnter时,NumericUpDown不会更改ToolStripStatusLabel

时间:2015-12-10 13:18:42

标签: c# winforms mousehover numericupdown toolstripstatuslabel

我使用此代码在悬停TextBox上实现,它适用于ComboBoxMaskedTextBoxNumericUpDown,但不适用于public static void addHovertip(ToolStripStatusLabel lb, Control c, string tip) { c.MouseEnter += (sender, e) => { lb.Text = tip; // MessageBox.Show(c.Name); }; c.MouseLeave += (sender, e) => { lb.Text = ""; }; } 。有人知道它为什么不起作用吗?

$(".select-cls").selectmenu()
   .selectmenu( "widget" ).addClass("red-cls");

1 个答案:

答案 0 :(得分:1)

我承认Hans Passant删除的答案有助于创造这个答案。

首先,您的代码运行正常。如果您正在处理经常发生的事件(比如MouseEvents),最好在代码中添加Debug.WriteLine,这样您就可以在调试器输出窗口中看到哪些事件,哪些控件,哪个顺序需要的地方。

主要问题是,由于数字向上/向下控件是一个带有两个不同子控件的控件,因此只要鼠标进入两个子控件之一,就会调用MouseLeave事件。会发生什么:当鼠标点击控件的单行边界时调用MouseEnter,并且当鼠标不再在该行上时调用MouseLeave。在MouseLeave中,您将Label设置为emtpy字符串。这给人的印象是你的代码不起作用。

只需添加一个循环来覆盖任何子控件即可解决此问题。这仍然会将标签设置为空字符串,但如果需要,它也会立即设置为正确的文本。

这是已修改的代码,其中包含Debug语句。

    public static void addHovertip(ToolStripStatusLabel lb, Control c, string tip)
    {
        c.MouseEnter += (sender, e) =>
        {
            Debug.WriteLine(String.Format("enter {0}", c));
            lb.Text = tip;
        };

        c.MouseLeave += (sender, e) =>
        {
            Debug.WriteLine(String.Format("Leave {0}", c));
            lb.Text = "";
        };

        // iterate over any child controls
        foreach(Control child in c.Controls)
        {
            // and add the hover tip on 
            // those childs as well
            addHovertip(lb, child, tip);
        }
    }

为了完整性,这里是我的测试表格的加载事件:

 private void Form1_Load(object sender, EventArgs e)
 {
     addHovertip((ToolStripStatusLabel) statusStrip1.Items[0], this.numericUpDown1, "fubar");
 }

这是一个动画gif,演示了当你将鼠标移入和移出Numeric Up Down控件时会发生什么:

numeric up down control and mouse event debug output