为 DataGridView 自动创建的列设置工具提示

本文关键字:设置 工具提示 创建 DataGridView | 更新日期: 2023-09-27 18:30:50

我想以编程方式将工具提示设置为DataGridView中自动生成的列。我试图使用AutoGeneratingColumn事件(http://msdn.microsoft.com/en-us/library/cc903950%28VS.95%29.aspx),但实际上只能访问DataGridColumn,而不能访问DataGridViewColumn,并且前者没有ToolTipText属性。

或者,如果我可以将工具提示绑定到一个也很棒的东西。目标是能够在我为基础DataTable设置列的同一位置操作/设置工具提示。

为 DataGridView 自动创建的列设置工具提示

我设法以这种方式解决了它:

void payloadDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    string tooltip = null;
    switch (e.Column.Header.ToString())
    {
        case "Column 1":
            tooltip = "Tooltip 1";
            break;
        case "Column 2":
            tooltip = "Tooltip 2";
            break;
    }
    if (tooltip != null)
    {
        var style = new Style(typeof(DataGridCell));
        style.Setters.Add(new Setter(ToolTipService.ToolTipProperty, tooltip));
        e.Column.CellStyle = style;
    }
}

特定单元格的工具提示文本:

DataGridView1.Rows[3].Cells["colnameX"].ToolTipText = " hover and see me";

将工具提示添加到动态添加的行特定单元格

private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    for (int index = e.RowIndex; index <= e.RowIndex + e.RowCount - 1; index++)                           
    {
        DataGridViewRow row = DataGridView1.Rows[index];
        row.Cells["colnameX"].ToolTipText = " hover and see me";
    }
}

如果您不想预设任何类型,并希望依靠反射从域对象中提取属性以用作工具提示,则可以这样做:

internal class SomeDomainObject
{
    [Description("Some tooltip text")]
    public string SomeProperty { get; set; } = string.Empty;
}

我们可以使用 ItemsSource 枚举器来获取网格的第一个元素,这反过来又会为我们提供要反映的域对象类型。在这里,我还使用 null 合并运算符将属性的名称设置为默认工具提示。(强制转换为 DataGrid 应该是安全的,因为我们知道我们正在使用 DataGrid)。

private void SomeGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var enumerator = ((DataGrid)sender).ItemsSource.GetEnumerator();
    enumerator.MoveNext();
    var itemType = enumerator.Current.GetType();    
    var propInfo = itemType.GetProperty(e.PropertyName);
    var toolTip = propInfo?.GetCustomAttributes<DescriptionAttribute>()
        ?.ElementAtOrDefault(0)?.Description ?? e.PropertyName;

不过,枚举可能不是完全 null 安全的,它需要域对象列表(或者更确切地说是 ObservableCollection)中的至少一个对象。如果您确定将哪种类型的域对象作为网格的源,则可以改为执行此操作。应该更快更安全。

private void SomeGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var propInfo = typeof(SomeDomainObject).GetProperty(e.PropertyName);
    var toolTip = propInfo?.GetCustomAttributes<DescriptionAttribute>()
        ?.ElementAtOrDefault(0)?.Description ?? e.PropertyName;

最后,要在标头上设置工具提示(仍在 SomeGrid_AutoGeneratingColumn 事件方法中):

var headerStyle = new Style(typeof(DataGridColumnHeader));
headerStyle.Setters.Add(new Setter(ToolTipService.ToolTipProperty, toolTip));
e.Column.HeaderStyle = headerStyle;