将鼠标悬停在 TableLayoutPanel 中的单元格上时显示文本 - C#

Show text when hovering over cell in TableLayoutPanel - C#

我有一个以编程方式创建的 TableLayoutPanel,它的每个单元格都包含一个面板。每个面板都有一个自定义标签。 (标签的已启用 属性 设置为 false;不确定这是否有所不同。)我想在用户将鼠标悬停在标签上时显示标签的文本。

根据我的阅读,工具提示是执行此操作的好方法,但我无法让它发挥作用。

TableLayoutPanel 的简称为 name "tlp",是表单的成员,以便于访问(与 ToolTip 一样,名称为 "toolTip")。

现在我只想获取任何类型的文本。一旦我可以让它工作,我会用标签的文本替换这里的字符串。

private void hoverOverSpace(object sender, EventArgs e)
{
    int row = tlp.GetRow((Panel)sender);
    int col = tlp.GetColumn((Panel)sender);

    toolTip.Show("Does this work?", tlp.GetControlFromPosition(col, row).Controls[0]);
    //toolTip.Show("Does this work?", tlp.GetControlFromPosition(col, row));
}

我尝试显示工具提示都没有成功。我在做某事吗 wrong/is 有更好的方法来完成我想要完成的事情吗?

编辑:我已尝试将工具提示添加到每个面板,但仍然没有任何反应

// Add Panels to TableLayoutPanel
for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        // Create new Panel
        Panel space = new Panel()
       {
            Size = new Size(45, 45),
            Dock = DockStyle.Fill,
            Margin = new Padding(0)
        };

        space.MouseClick += new MouseEventHandler(clickOnSpace);

        CustomLabel info = new CustomLabel(false, 0, Color.White);      // Create new CustomLabel
        space.Controls.Add(info);   // Add CustomLabel to Panel
        tlp.Controls.Add(space, j, i);      // Add Panel to TableLayoutPanel

        toolTip = new ToolTip();
        toolTip.SetToolTip(space, info.Text);
    }
}

此答案基于以下答案中提供的代码:tablelayoutPanel get cell location from mouse over, by: Aland Li Microsoft CSS

    #region GetPosition
    // Modified from answer to: tablelayoutPanel get cell location from mouse over
    // By:  Aland Li Microsoft CSS
    // https://social.msdn.microsoft.com/Forums/windows/en-US/9bb6f42e-046d-42a0-8c83-febb1dcf98a7/tablelayoutpanel-get-cell-location-from-mouse-over?forum=winforms

//The method to get the position of the cell under the mouse.
private TableLayoutPanelCellPosition GetCellPosition(TableLayoutPanel panel, Point p)
{

    //Cell position
    TableLayoutPanelCellPosition pos = new TableLayoutPanelCellPosition(0, 0);
    //Panel size.
    Size size = panel.Size;
    //average cell size.
    SizeF cellAutoSize = new SizeF(size.Width / panel.ColumnCount, size.Height / panel.RowCount);

    //Get the cell row.
    //y coordinate
    float y = 0;
    for (int i = 0; i < panel.RowCount; i++)
    {
        //Calculate the summary of the row heights.
        SizeType type = panel.RowStyles[i].SizeType;
        float height = panel.RowStyles[i].Height;
        switch (type)
        {
            case SizeType.Absolute:
                y += height;
                break;
            case SizeType.Percent:
                y += height / 100 * size.Height;
                break;
            case SizeType.AutoSize:
                y += cellAutoSize.Height;
                break;
        }
        //Check the mouse position to decide if the cell is in current row.
        if ((int)y > p.Y)
        {
            pos.Row = i;
            break;
        }
    }

    //Get the cell column.
    //x coordinate
    float x = 0;
    for (int i = 0; i < panel.ColumnCount; i++)
    {
        //Calculate the summary of the row widths.
        SizeType type = panel.ColumnStyles[i].SizeType;
        float width = panel.ColumnStyles[i].Width;
        switch (type)
        {
            case SizeType.Absolute:
                x += width;
                break;
            case SizeType.Percent:
                x += width / 100 * size.Width;
                break;
            case SizeType.AutoSize:
                x += cellAutoSize.Width;
                break;
        }
        //Check the mouse position to decide if the cell is in current column.
        if ((int)x > p.X)
        {
            pos.Column = i;
            break;
        }
    }

    //return the mouse position.
    return pos;
}
#endregion

它使用引用代码计算得到的TableLayoutPanelCellPosition在该位置(如果有的话)获得Control并将其Text属性显示为ToolTipTableLayoutPanel.MouseHover 事件上。

private void tableLayoutPanel1_MouseHover(object sender, EventArgs e)
{
    Point pt = tableLayoutPanel1.PointToClient(Control.MousePosition);
    TableLayoutPanelCellPosition pos = GetCellPosition(tableLayoutPanel1, pt);
    Control c = tableLayoutPanel1.GetControlFromPosition(pos.Column, pos.Row);
    if (c != null)
    {
        toolTip1.Show(c.Text, tableLayoutPanel1, pt, 500);
    }
}

编辑:

我错过了 TLP 填充了 Dock 属性 设置为 DockStyle.Fill` 的控件。放置在 TLP 中的此类控件将接收鼠标事件而不是 TLP。因此,作为修复,添加此方法。

private void showtip(object sender, EventArgs e)
{
    Point pt = tableLayoutPanel1.PointToClient(Control.MousePosition);
    TableLayoutPanelCellPosition pos = GetCellPosition(tableLayoutPanel1, pt);
    Control c = tableLayoutPanel1.GetControlFromPosition(pos.Column, pos.Row);
    if (c != null && c.Controls.Count > 0)
    {
        toolTip1.Show(c.Controls[0].Text, tableLayoutPanel1, pt, 500);
    }
}

然后像这样连接每个 PanelLabel 分组:

this.panel4.MouseHover += new System.EventHandler(this.showtip);
this.label4.MouseHover += new System.EventHandler(this.showtip);