C# 更改Winforms DataGridView工具提示字体
我的程序中有DataGridView,我在它上面在MouseMove下编写了一个自定义工具提示,如下所示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
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事件。因此,看起来您可能确实必须使用外部单元,这将提出如何到达正确单元的问题。应该有帮助……好的,谢谢。然后我应该在我的故事中加入工具提示控件。