如何检查按钮是否悬停,并输出消息

时间:2012-04-20 11:24:25

标签: c# .net winforms

我在应用程序中有40个按钮,我需要在状态字段中显示的自定义悬停。我已经创建了一个添加特定消息的功能和一个要删除的功能,因此在悬停时,它会调用该功能,并且在离开按钮时也是如此。

我想要40条不同的消息,其中一种方法就是检查鼠标悬停在哪个按钮上。

if(button1.hovered == true){
  string message = "scenario1";
}
elseif(button2.hovered == true){
  scenario2...etc
}

有没有办法检查是否徘徊?并在if语句中检查它?

我决定添加更多信息,以便更容易理解我的观点。

鼠标悬停时将消息添加到listview。

    void messAdd(object sender, EventArgs e)
    {


        string now = DateTime.Now.ToString("M/d/yyyy") + " - " + DateTime.Now.ToString("HH:mm:ss tt");
        string message = "message 1";
        found = false;

        ListViewItem item = new ListViewItem(message);
        foreach (ListViewItem z in listView1.Items)
        {
            if (z.Text == message)
            { found = true; }
        }

        if (found == false)
        {
            item.SubItems.Add(now.ToString());
            listView1.Items.Add(item);
            listView1.EnsureVisible(item.Index);
        }
        else
        {
            DeleteIfNecessary(message);
        }
    }

鼠标离开时从列表框中删除邮件:

    void messdel(object sender, EventArgs e)
    {


        string message = "message 1";
        found = false;

        ListViewItem item = new ListViewItem(message);
        foreach (ListViewItem z in listView1.Items)
        {
            if (z.Text == message)
            { found = true; }
        }

        if (found == true)
        {
            DeleteIfNecessary(message);
        }

    }

我可以为每个按钮制作4个这样的功能,但由于我需要40个不同的消息,愚蠢的是,但是没有办法通过该函数发送消息参数,所以我需要使用if测试并检查女巫按钮悬停,然后将消息输出到指定的按钮。我正在使用visual studio和windows窗体,抱歉没有提到。

2 个答案:

答案 0 :(得分:4)

有一个Control.MouseHover事件。您可以实施:

private void button_MouseHover(object sender, System.EventArgs e)
{
    doSomething(sender);
}

并且对于所有按钮,在IDE中将MouseHover的事件处理程序设置为button_MouseHover,或者在代码中执行:

this.button1.MouseHover += new System.EventHandler(this.button_MouseHover);

通过检查sender参数,您可以知道哪个按钮正在调用事件处理程序。

<强>更新

根据您在问题中的更新,我认为您可以使用messAdd作为所有按钮的MouseEnter事件的事件处理程序,并使用messdel作为事件处理程序为MouseLeave。同样,您不需要为所有按钮创建这两种方法的副本,只需为所有按钮分配相同事件处理程序方法,然后选中sender知道谁在调用事件处理程序 - 然后创建不同的消息。

sender是您的Button对象。只需将其转换为Button并访问您想要的内容(文本,标记,名称等),以了解哪个Button尝试在列表视图中添加/删除邮件。

更新2

Button button = sender as Button;
if (button == null) {
    // not a button, do nothing
    return;
}

string message = String.Empty;
if (sender.Equals(button1)) {
    message = "message1";
} else if (sender.Equals(button2)) {
    message = "message2";
} ...

答案 1 :(得分:0)

我将假设这是WinForms,因为你没有另外指定。

您可以创建一个int hoveredId来表示悬停的按钮(值-1表示没有任何内容悬停)。创建按钮时,将Tag属性设置为按钮的ID号。

然后将每个按钮注册到这两个功能:

private void buttons_MouseEnter(object sender, System.EventArgs e)
{
    Button btn = ((Button)sender);

    hoveredId = (int)btn.Tag;
}

private void buttons_MouseLeave(object sender, System.EventArgs e)
{
    Button btn = ((Button)sender);

    if ((int)btn.Tag == hoveredId)
        hoveredId = -1;
}

检查悬停的按钮时,可以使用switch语句:

switch (hoveredId)
{
  case 1:
    string message = "scenario1";
    break;
  case 2:
    scenario2...etc
    break;
}