我的程序中有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"。
答案 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);
}
请注意,如果您的字体小于 <默认值<(我的),则会显示一些额外的可用空间,这非常好。
但如果它更大,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);
}
请注意,关于填充空格以使文本适合边界的注释仍然适用..