我使用此代码在悬停TextBox
上实现,它适用于ComboBox
,MaskedTextBox
,NumericUpDown
,但不适用于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");
答案 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控件时会发生什么: