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

j13ufse2  于 2023-02-13  发布在  其他
关注(0)|答案(3)|浏览(139)

我想通过编程将工具提示设置为DataGridView中自动生成的列。我尝试使用AutoGeneratingColumn事件(http://msdn.microsoft.com/en-us/library/cc903950%28VS.95%29.aspx),但实际上只能访问DataGridColumn,而不能访问DataGridViewColumn,而且前者没有ToolTipText属性。
或者如果我能将工具提示绑定到一个源代码,那也会很棒。目标是能够在我为底层DataTable设置列的同一个地方操作/设置工具提示。

6yt4nkrj

6yt4nkrj1#

我是这么解决的:

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;
    }
}
2sbarzqh

2sbarzqh2#

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

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";

    }
}
nszi6y05

nszi6y053#

如果你不想预设任何类型,而想依靠反射从你的域对象中提取一个属性作为工具提示,你可以这样做:

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

我们可以使用ItemsSource枚举器来获取网格的第一个元素,这反过来又会给我们提供要反映的域对象类型。这里,我还使用空合并操作符将属性的名称设置为默认工具提示。(由于我们知道正在使用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;

枚举可能不是完全空值安全的,并且它需要域对象列表(或者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;

相关问题