Настройка всплывающей подсказки для DataGridView автоматически создаваемых столбцов
Я хотел бы программно установить всплывающие подсказки для автоматически сгенерированных столбцов в DataGridView
, Я пытался использовать AutoGeneratingColumn
событие ( http://msdn.microsoft.com/en-us/library/cc903950%28VS.95%29.aspx), но на самом деле доступ может только DataGridColumn
не DataGridViewColumn
и первый не имеет ToolTipText
имущество.
Или если бы я мог связать всплывающие подсказки с источником, который также был бы великолепен. Цель состоит в том, чтобы иметь возможность манипулировать / устанавливать всплывающие подсказки в том же месте, где я устанавливаю столбцы для основного DataTable
,
3 ответа
Мне удалось решить это так:
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;
}
}
Если вы не хотите предполагать какие-либо типы и хотите полагаться на отражение для извлечения атрибута из объекта домена для использования в качестве всплывающей подсказки, вы можете сделать это следующим образом:
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;
Однако перечисление, вероятно, не является полностью нулевым, и ему нужен хотя бы один объект в вашем списке (или, скорее, в вашей 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;
tooltiptext для конкретной ячейки:
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";
}
}