【问题标题】:Changing Winforms DataGridView ToolTip font更改 Winforms DataGridView ToolTip 字体
【发布时间】:2016-04-26 06:34:15
【问题描述】:

我的程序中有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 工具提示的默认字体以外的其他字体?例如“新快递”。

【问题讨论】:

    标签: c# vb.net


    【解决方案1】:

    你需要OwnerDrawToolTip

    这是一个例子:

    首先为ToolTip设置属性OwnerDraw = true

    然后编码它的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);
    }
    

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

    但如果它更大Bounds 可能需要适应,这可能会有些棘手。您必须在文本的末尾和底部留出足够的空间来强制使用足够的Bounds 大小。

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

    仍然可能会发现需要添加 几个空格:您的固定字体平均会占用更多空间,因此提供的 Bounds 可能会变成反正还是有点紧..

    更新

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

    • DGV 旨在显示与自己的单元格相关的工具提示。但是他们没有可访问的抽奖事件;所以我们不能使用它们。所以我们关闭它们:dataGridView.ShowCellToolTips = false;

    • 由于我们需要为每个单元格显示不同的单元格,因此我们需要向它们显示我们需要检测何时结束了一个新单元格。 DGV 对每个单元格没有不同的文本,尽管单元格有自己的文本,但不会将其交给外部 ToolTip。所以我们可以编写 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); 
    }
    

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

    【讨论】:

    • 您好 TaW,为此我需要单独的控件“工具提示”,或者我可以使用 DataGridView 中的内置工具提示来执行此操作?
    • 嗯,这是个好问题。我没有看到用于绘制工具提示的 DGV 事件。所以看起来你可能确实必须使用外部的,这将提出如何获得正确的细胞的问题。 This post 应该有帮助..
    • 好的,谢谢。然后我应该在我的故事中加入 ToolTip 控件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多