Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改Winforms DataGridView工具提示字体_C#_Vb.net - Fatal编程技术网

C# 更改Winforms DataGridView工具提示字体

C# 更改Winforms DataGridView工具提示字体,c#,vb.net,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.Hit

我的程序中有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
   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)
在get_data(s,sb)下,我用字符串填充StringBuilder,表示“列”格式的数据,如下所示

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
   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的工具提示确定除默认字体以外的其他字体?例如“Courier New”。

您需要
OwnerDraw
工具提示

以下是一个例子:

首先为工具提示设置属性
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);
}

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

但是如果更大
边界可能需要调整,这可能会变得有些棘手。您必须在文本的末尾和底部留出足够的空间,以执行足够的
边界
大小

为此,您必须测量较大的
字体和添加空格所需的空间,直到
边界足够大。无需移除它们,因为过度拉伸空间不会成为问题;但是坚持原来的
e.Font
肯定要容易得多

仍然可能会发现需要添加几个空格:您的固定字体平均会占用更多的空间,因此提供的
边界可能会变得有点紧

更新

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

  • DGV适合于显示自己的单元格相关工具提示。但他们没有一个可访问的抽签活动;所以我们不能使用它们。所以我们关闭它们:
    dataGridView.ShowCellToolTips=false

  • 因为我们需要为每个细胞显示一个不同的细胞,所以我们需要显示它们,我们需要检测何时超过一个新细胞。DGV没有为每个单元格指定不同的文本,尽管这些单元格有它们的文本,但不会将其传递给外部工具提示。我们可以编写MouseMove事件,可能是这样的:

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

private void dataGridView1\u CellMouseMove(对象发送方,DataGridViewCellMouseEventArgs e)
{
如果(e.ColumnIndex<0 | | e.RowIndex<0
||dataGridView1[e.ColumnIndex,e.RowIndex].Value==null)返回;
//使用您自己的功能设置文本!
字符串s=dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString();
//检查更改以防止闪烁!
if(s==toolTip1.GetToolTip(dataGridView1))返回;
toolTip1.SetToolTip(dataGridView1,s);
}

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

Hi TaW,为此我需要单独的控件“工具提示”,或者我可以使用DataGridView中的内置工具提示执行此操作?嗯,这是一个好问题。我没有看到用于绘制工具提示的DGV事件。因此,看起来您可能确实必须使用外部单元,这将提出如何到达正确单元的问题。应该有帮助……好的,谢谢。然后我应该在我的故事中加入工具提示控件。