我正在尝试为TreeView中的节点中的单击和双击事件定义不同的处理程序,但是始终触发click事件并忽略double。 我可以同时工作吗?
尝试1
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
MessageBox.Show(e.Node.Text.ToUpper());
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
MessageBox.Show(e.Node.Text);
}
try2
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
switch (e.Clicks)
{
case 1:
MessageBox.Show(e.Node.Text); break;
case 2:
MessageBox.Show(e.Node.Text.ToUpper()); break;
default:
break;
}
}
答案 0 :(得分:2)
我怀疑,问题是你在MessageBox
事件上显示Click
。 当显示该消息框时,它“占用”所有输入(消息框是模态对话框),并且用户对TreeView
的第二次点击无法识别。
Hans Passant's answer已经详细解释了Windows如何确定点击事件是Click
还是DoubleClick
,所以我不会在此处重复。
但是,解决方案很简单:从事件处理程序中删除MessageBox.Show
语句,一切都会按预期工作。您需要找到一些其他方法来提醒用户被选中的节点(如果这是必要的话),但这将成为伪装的祝福。每次单击节点时弹出的消息框都不是友好的UI。对于您的特定情况(至少我能说的最好),不需要更复杂的技术,如计时器。
这也是调试涉及Windows用户界面元素的代码的一个重要的更大课程。每当你将MessageBox
扔进混音时,你就有可能打破一系列微妙的事件。最好的直接替换可能是调用Debug.WriteLine
而不是。
答案 1 :(得分:2)
你可以尝试这种方法......但这不是一种正确的方法
需要一个定时器控制,比如说timer1,设置间隔为500.
timer1.Interval = 500;
声明一个变量来检查鼠标点击
static int mClick = 0;
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
mClick++;
timer1.Enabled = true;
}
在计时器滴答
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
if (mClick == 1)
{
mClick = 0;
MessageBox.Show("single click");
}
if (mClick == 2)
{
mClick = 0;
MessageBox.Show("double click");
}
}
这在我身边正常运作。
休息取决于你...
答案 2 :(得分:1)
这是设计使用,当用户双击时,始终首先获取Click事件。知道她打算双击需要一台时间机器。您可以创建一个,在Click事件中启动一个Timer,并将其Interval设置为SystemInformation.DoubleClickTime + 45。
获取DoubleClick事件后,将计时器的“启用”属性设置为false,然后执行双击操作。获取Tick事件时,将计时器的Enable属性设置为false并执行单击操作。它不具备出色的用户界面体验。
由于消息框,您没有收到DoubleClick事件,因此它将焦点拉开。
答案 3 :(得分:0)
您可以在Click事件处理程序中检查点击次数。它应该在EventArgs实例中。
答案 4 :(得分:0)
如果从上面的代码中删除单击处理程序,则应触发双击处理程序。因为单击处理程序显示一个对话框,所以双击的第二次单击无法到达双击处理程序。