更改Winforms DataGridView ToolTip字体

时间:2016-04-26 06:34:15

标签: c# vb.net

我的程序中有DataGridView,我在MouseMove下编写了一个自定义工具提示,就像这样......

Private Sub dgv_dokument_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgv_dokument.MouseMove

    Dim hit As DataGridView.HitTestInfo = dgv_dokument.HitTest(e.X, e.Y)

    If hit.Type = DataGridViewHitTestType.Cell Then
        If hit.ColumnIndex >= 0 AndAlso hit.RowIndex >= 0 Then
            Dim s As Integer = Convert.ToInt32(dgv_dokument.Item(co.GetColIndex(dgv_dokument, "myNumCol"), hit.RowIndex).Value)
            Dim ttText As String = ""
            If s > 0 Then
                Dim sb As New StringBuilder
                get_data(s, sb)
                ttText = sb.ToString
            End If

            dgv_dokument.Item(hit.ColumnIndex, hit.RowIndex).ToolTipText = ttText
            Exit Sub
        End If
    End If
End Sub

在get_data(s,sb)下,我用字符串填充StringBuilder,其中包含"列"格式化数据,像这样......

   sb.Append(code.ToString.PadLeft(5) + " ")
   sb.Append(name.Trim.PadRight(27) + " ")
   sb.Append(meas.Trim.PadRight(3) + " ")
   sb.Append(qty.ToString("N2").PadLeft(10) + " ")
   sb.Append(price.ToString("N2").PadLeft(12))
   sb.Append(Environment.NewLine)

除了我希望看到我的工具提示列对齐之外,一切正常。这可以通过在ToolTop中使用比例字体来完成。

我可以以某种方式(以及如何)确定DataGridView的ToolTip的默认字体以外的其他字体吗?例如" Courier New"。

1 个答案:

答案 0 :(得分:1)

您需要OwnerDraw ToolTip

以下是一个例子:

首先为OwnerDraw = true设置属性ToolTip

然后编写其Draw事件,可能是这样的:

private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
    e.DrawBackground();
    e.DrawBorder();
    using (Font f = new Font("Consolas", 8f))
        e.Graphics.DrawString(e.ToolTipText, f, SystemBrushes.ControlText, e.Bounds);
}

enter image description here

请注意,如果您的字体小于 <默认值<(我的),则会显示一些额外的可用空间,这非常好。

但如果它更大Bounds可能需要适应,这可能会有点棘手。您必须填充文本,并在末尾和底部留出足够的空间以强制执行足够的Bounds大小。

为此,您需要测量较大Font添加空格所需的空间,直到Bounds增长到足够大。不需要删除它们,因为透支空间不会成为问题;但坚持原来e.Font肯定要容易得多。

仍然可能会发现需要添加少数空格:平均而言,您的固定字体会占用更多空间,因此提供了Bounds反正可能会变得有点紧张..

<强>更新

由于您使用的是DataGridView,因此需要考虑一些额外内容:

  • DGV旨在展示自己的细胞相关工具提示。但他们没有可访问的抽奖活动;所以我们不能使用它们。所以我们将其关闭:dataGridView.ShowCellToolTips = false;

  • 由于我们需要为每个单元显示不同的单元,我们需要显示它们,我们需要检测我们何时在新单元上。 DGV没有为每个单元格提供不同的文本,尽管单元格有自己的单元格,但不会将其移交给外部工具提示。所以我们可以编写MouseMove事件的代码,可能是这样的:

private void dataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex < 0 || e.RowIndex < 0 
     || dataGridView1[e.ColumnIndex, e.RowIndex].Value == null) return;

    // use your own function to set the text!
    string s = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
    // check for changes to prevent flicker!
    if (s == toolTip1.GetToolTip(dataGridView1)) return;

    toolTip1.SetToolTip(dataGridView1, s); 
}

请注意,关于填充空格以使文本适合边界的注释仍然适用..