winforms 是否可以延长DataGridView单元格工具提示的显示持续时间?

mctunoxg  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(143)

基于这个How to: Add ToolTips to Individual Cells in a Windows Forms DataGridView Control-我为DataGridView中的单个单元格实现了一个特定的工具提示。

void init() {
   dgv.CellFormatting += CellToolTip;
 }

 void CellToolTip(object sender, DataGridViewCellFormattingEventArgs e) {
    if ((e.ColumnIndex == dgv.Columns["xxx"].Index) && e.Value != null)
    {
      [...]
      DataGridViewCell cell = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
      cell.ToolTipText = "test";
    }             
 }

是否可以修改持续时间以延长工具提示的显示时间,或者是否必须创建ToolTip对象并使用ToolTip.AutomaticDelay等属性?

ufj5ltwl

ufj5ltwl1#

可以使用Reflection访问内部ToolTip组件,该组件是名为DataGridViewToolTip的内部私有类的成员。该类具有一个公共只读属性,返回ToolTip示例,可以访问该示例以获取或设置其属性和/或执行示例方法。
下面是扩展方法示例。

// +
using System.Reflection;
// ...

internal static class DataGridViewExt
{
    internal static ToolTip GetInternalToolTip(this DataGridView dgv)
    {
        var ttcName = "toolTipControl";
        var ttpName = "ToolTip";
        var ttc = dgv
            .GetType()
            .GetField(ttcName, BindingFlags.NonPublic | BindingFlags.Instance)
            .GetValue(dgv);
        var ttp = ttc
            .GetType()
            .GetProperty(ttpName, BindingFlags.Public | BindingFlags.Instance)
            .GetValue(ttc);

        return ttp as ToolTip;
    }
}

调用GetInternalToolTip扩展方法并设置组件的属性。

private  void SomeCaller()
{
    var ttp = dataGridView1.GetInternalToolTip();

    ttp.AutoPopDelay = 3000;
    ttp.ToolTipTitle = "Tip";
    ttp.ToolTipIcon = ToolTipIcon.Info;
}

对于您的特定问题,您只需要调整AutoPopDelay属性。

private void SomeCaller() => dataGridView1.GetInternalToolTip().AutoPopDelay = 3000;

相关问题