C# 使用鼠标悬停事件时会显示多个工具提示文本

C# 使用鼠标悬停事件时会显示多个工具提示文本,c#,tooltip,C#,Tooltip,我有一张表格,上面有一个选择客户的组合和一个按钮。 选择客户并将鼠标移到按钮上时,将显示工具提示,其中包含有关该客户的信息 我已经使用tooltip\u Draw自定义了工具提示 所有这些都很好 问题是,当我更改取消选择的客户,然后将鼠标移到按钮上时,会显示几个工具提示文本。我以前选择的每个客户都有一个 我试图以某种方式清空工具提示,但似乎没有任何效果 private void bttCitas_MouseHover(object sender, EventArgs e) { strin

我有一张表格,上面有一个选择客户的组合和一个按钮。 选择客户并将鼠标移到按钮上时,将显示工具提示,其中包含有关该客户的信息

我已经使用tooltip\u Draw自定义了工具提示

所有这些都很好

问题是,当我更改取消选择的客户,然后将鼠标移到按钮上时,会显示几个工具提示文本。我以前选择的每个客户都有一个

我试图以某种方式清空工具提示,但似乎没有任何效果

private void bttCitas_MouseHover(object sender, EventArgs e)
{
    string mSQL = @"    SELECT one, two, three
            FROM customers
            WHERE id = " + comboCliente.SelectedValue + ";";
    DataTable tablaTemp = retrieveData(mSQL);

    string customerText = ConvertDataTableToString(tablaTemp);
    System.Windows.Forms.ToolTip Emergente = new System.Windows.Forms.ToolTip();
    Emergente.OwnerDraw = true; 
    Emergente.Draw += new DrawToolTipEventHandler(ToolTip_Draw);
    Emergente.AutoPopDelay = 150000;
    Emergente.InitialDelay = 500;
    Emergente.ReshowDelay = 500;
    Emergente.SetToolTip(this.bttCitas, customerText);            
}


void ToolTip_Draw(object sender, DrawToolTipEventArgs e)
{
    using (e.Graphics)
    {
        Font f = new Font("Courier New", 9.0f);
        e.DrawBackground();

        e.DrawBorder();
        SolidBrush myBrush = new SolidBrush(GLOBALToolTipFontColor);                
        e.Graphics.DrawString(e.ToolTipText, f, myBrush, new PointF(2, 2));
    }
}

我终于明白了会发生什么

我需要在MouseOver事件中声明emergent,然后在MouseLeave中处理它:

private ToolTip Emergente; 

private void bttCitas_MouseHover(object sender, EventArgs e)
{
    string mSQL = @"    SELECT one, two, three
            FROM customers
            WHERE id = " + comboCliente.SelectedValue + ";";
    DataTable tablaTemp = retrieveData(mSQL);

    string customerText = ConvertDataTableToString(tablaTemp);
    Emergente = new System.Windows.Forms.ToolTip();
    Emergente.OwnerDraw = true; 
    Emergente.Draw += new DrawToolTipEventHandler(ToolTip_Draw);
    Emergente.AutoPopDelay = 150000;
    Emergente.InitialDelay = 500;
    Emergente.ReshowDelay = 500;
    Emergente.SetToolTip(this.bttCitas, customerText);            
}


void ToolTip_Draw(object sender, DrawToolTipEventArgs e)
{
    using (e.Graphics)
    {
        Font f = new Font("Courier New", 9.0f);
        e.DrawBackground();

        e.DrawBorder();
        SolidBrush myBrush = new SolidBrush(GLOBALToolTipFontColor);                
        e.Graphics.DrawString(e.ToolTipText, f, myBrush, new PointF(2, 2));
    }
}


private void bttCitas_MouseLeave(object sender, EventArgs e)
{
        Emergente.Dispose(); 
}

虽然我无法确定原因,但我肯定会将工具提示创建移动到一个比鼠标悬停频率更低的事件;可能是您更新客户的代码。这样,每次将鼠标移到按钮上时,您都在执行完整的数据库操作,只是为了一次又一次地检索相同的信息,并创建更多的工具提示实例。