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

时间:2016-08-19 13:54:38

标签: c# winforms tooltip tablelayoutpanel

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

根据我的阅读,工具提示是一种很好的方法,但我无法让它工作。

TableLayoutPanel简称为“tlp”,是表单的成员,便于访问(同样使用ToolTip,名称为“toolTip”)。

现在我只想尝试任何类型的文字。一旦我能够使用它,我就会用Label的文本替换我的字符串。

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));
}

我尝试显示工具提示都没有成功。我做错了什么/有没有更好的方法来做我想要完成的事情?

编辑:我试图将工具提示添加到每个面板,但仍然没有发生任何事情

// 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);
    }
}

1 个答案:

答案 0 :(得分:1)

此答案基于答案: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上将ToolTip属性显示为TableLayoutPanel.MouseHover {1}}事件。

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);