Как сделать подсказку в datagrid
Перейти к содержимому

Как сделать подсказку в datagrid

  • автор:

Как сделать подсказку в datagrid

Элемент ToolTip представляет всплывающую подсказку при наведении на какой-нибудь элемент. Для определения всплывающей подсказки у элементов уже есть свойство ToolTip, которому можно задать текст, отображаемый при наведении:

Также мы можем более точно настроить всплывающую подсказку с помощью свойства Button.ToolTip :

  

Всплывающие подсказки можно применять не только кнопкам, но и ко всем другим элементам управления, например, к текстовому блоку:

     Hello WPF    

Оба определения всплывающей подсказки будут аналогичны.

Поскольку ToolTip является элементом управления содержимого, то в него можно встроить другие элементы для создания более богатой функциональности. Например:

Элемент ToolTip в WPF

Здесь у нас два переключателя, и на одном из них определен расширенный элемент ToolTip: а именно в него вложен элемент Image, выводящий изображение, и элемент TextBlock. Таким образом, можно создавать всплывающие подсказки с различным наполнением.

Изображение для элемента Image в данном случае было добавлено в проект.

Свойства ToolTip

Некоторые полезные свойства элемента Tooltip:

  • HasDropShadow : определяет, будет ли всплывающая подсказка отбрасывать тень.
  • Placement : определяет, как будет позиционироваться всплывающая подсказка на окне приложения. По умолчанию ее верхний левый угол позиционируется на указатель мыши.
  • HorizontalOffset/VerticalOffset : определяет смещение относительно начального местоположения.
  • PlacementTarget : определяет позицию всплывающей подсказки относительно другого элемента управления.
     Цена: Связной: 54990 рублей Ситилинк: 539990 рублей       

Здесь у нас три переключателя. У первого мы задаем свойства через элемент ToolTip. Для второго переключателя мы также можем задать свойства, несмотря на то, что здесь мы всплывающую подсказку задаем просто ToolTip=»Цена: 29990 рублей» Content=»Nexus 5X» . В этом случае мы можем использовать прикрепленные свойства класса ToolTipService :

  • InitialShowDelay : задает задержку перед отображением всплывающей подсказки
  • ShowDuration : устанавливает время отображения всплывающей подсказки
  • BetweenShowDelay : устанавливает время, в течение которого пользователь сможет перейти к другому элементу с подсказкой, и для этого элемента не будет работать свойство InitialShowDelay (если оно указано)
  • ToolTip : устанавливает содержимое всплывающей подсказки
  • HasDropShadow : определяет, будет ли подсказка отбрасывать тень
  • ShowOnDisabled : устанавливает поведение всплывающей подсказки для недоступного элемента (со значением IsEnabled=»True» ). Если это свойство равно true, то подсказка отображается для недоступных элементов. По умолчанию равно false.
  • Placement / HorizontalOffset / VerticalOffset / PlacementTarget : те же свойства, что и у элемента ToolTip, которые устанавливают положение всплывающей подсказки
Программное создание всплывающей подсказки

Допустим, в коде XAML у нас определена следующая кнопка:

Тогда в файле кода C# мы могли бы определить всплывающую подсказку для кнопки так:

ToolTip toolTip = new ToolTip(); StackPanel toolTipPanel = new StackPanel(); toolTipPanel.Children.Add(new TextBlock < Text = "Заголовок", FontSize=16 >); toolTipPanel.Children.Add(new TextBlock < Text = "Текст" >); toolTip.Content = toolTipPanel; button1.ToolTip = toolTip;

Popup

Элемент Popup также представляет всплывающее окно, только в данном случае оно имеет другую функциональность. Если Tooltip отображается автоматически при наведении и также автоматически скрывается через некоторое время, то в случае с Popup все эти действия нам надо задавать вручную.

Так, чтобы отразить при наведении мыши на элемент всплывающее окно, нам надо соответственным образом обработать событие MouseEnter .

Второй момент, который надо учесть, это установка свойства StaysOpen=»False» . По умолчанию оно равно True, а это значит, что при отображении окна, оно больше не исчезнет, пока мы не установим явно значение этого свойства в False.

Итак, создадим всплывающее окно:

    Чтобы узнать больше, посетите сайт metanit.com   

И обработчик наведения курсора мыши на кнопку в коде c#:

private void Button_MouseEnter_1(object sender, MouseEventArgs e)

Элемент Popup в WPF

И при наведении указателя мыши на элемент появится всплывающее окно с сообщением.

Всплывающая подсказка для заголовка DataGridView

Приветствую.
У обычных ячеек выставить ToolTipText не вызвало проблем, но когда пробую сделать тоже самое для заголовочных ячеек — возникает проблема из-за того что индекс строки равен -1.

dataGridView1.Rows[-1].Cells[1].ToolTipText = "Подсказка";

Можно как-то задать всплывающее окно по-другому?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Всплывающая подсказка для элемента в comboBox
ей богу делаю БД на C# и почти все основные методы бесполезны для заданных задач. в общем сложно.

Всплывающая подсказка для элементов ListBox
Добрый день. Подскажите пожалуйста, как сделать всплывающую подсказку для элементов ListBox? Не.

Всплывающая подсказка для раскрытого списка ComboBox
Есть ли возможность показывать всплывающие подсказки для элементов выпадающего списка компонента.

Всплывающая подсказка
Всем привет! Использовал код ToolTip q1 = new ToolTip(); q1.SetToolTip(Peremena1, "Время 1.

Регистрация: 08.07.2014
Сообщений: 38

dataGridView1.Rows["номер строки"].HeaderCell.ToolTipText = "Подсказка";

Добавлено через 7 минут
Можно создать событие RowsAdded, которое автоматически будет добавлять подсказку к созданной строке заголовку

1 2 3 4 5 6
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { dataGridPacketIn.Rows[e.RowIndex].HeaderCell.ToolTipText = "подсказка"; }

Текст подсказка в ячейке DataGrid

Здравствуйте, подскажите пожалуйста как сделать подсказку, при создании новой строки в ячейке DataGrid с серым текстом, которая при редактировании исчезала и можно было записать в неё другой текст. Для пояснения пример .gif из Эксель:

Варианты пробовал, ElementStyle, EditingElementStyle, в textBlock устанавливал FallBackValue=, вроде текст в новой строке появляется, но после редактирования остаётся цветом который относится к FallBackValue.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Datagrid в ячейке Datagrid c корректным отображением границ
Задача поместить связанные данные (две таблицы Sql связаны по id ) в виде таблицы ячейки одной их.

WPF, DataGrid и многострочие в ячейке
Как ясно из вопроса: есть DataGrid и текст в ячейках. Как сделать перенос текста внутри его? Везде.

Два значения из БД в одной ячейке DataGrid
День добрый. Из БД берётся два значения цены из разных таблиц, надо что бы эти значения были.

Заполнение значения в определённой ячейке DataGrid
Добрый день, уважаемые форумчане! Не так давно стал изучать WPF. Возник один вопрос, который.

Эксперт .NET

15238 / 10356 / 2721
Регистрация: 21.04.2018
Сообщений: 30,670
Записей в блоге: 2
Посмотрите https://www.cyberforum.ru/faq/. 17.html#17 . Что-то подобное надо.
Регистрация: 12.04.2017
Сообщений: 55

Элд Хасп, Прошу прощения, но никак не могу связать первый вами указанный вариант с datagrid в XAML «Взят с ресурса stackoverflow.com — TextBox Подсказка» (https://www.cyberforum.ru/faq/. 17.html#17), всё вокруг да около хожу в точку никак не попаду, с одним вариантом пытаюсь через DataGridTemplateColumn.CellTemplate, вроде как подсказка появляется на она после добавления строки и в предыдущей остается, через DataGridTextColumn.ElementStyle и DataGridTextColumn.EditingElementStyle пытаюсь ошибок не выдаёт, но текст не появляется, вариантов пробовал множество, результата никак не добьюсь. Запутался уже.

Эксперт .NET

15238 / 10356 / 2721
Регистрация: 21.04.2018
Сообщений: 30,670
Записей в блоге: 2

Вам, как я думаю, надо создать UserControl, а уже его прописывать в ячейку.
У Вас здесь только картинка. Скиньте какой-то маленький кусок рабочего кода для примера понятного Вам.
Постараюсь на нём показать.

Регистрация: 12.04.2017
Сообщений: 55

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> >  x:Name="DGR" AutoGenerateColumns="False"> >  x:Key="BooleanToVisibilityConverter"/> > >  Header="Name" Binding=""> >  TargetType="TextBlock">  Property="Visibility" Value="Visible"/> >  Binding=", ElementName=TextB>">  Property="Visibility" Value="Hidden"/> > > > > >  TargetType="TextBox" x:Name="TextB">  Property="Background" Value=""/> > > >  Header="SecondName" Binding=""/> > > > >
1 2 3 4 5 6 7 8 9 10 11
public partial class MainWindow : Window { ObservableCollectionPerson> person = new ObservableCollectionPerson>(); public MainWindow() { InitializeComponent(); if (person == null) person = new ObservableCollectionPerson>(); DGR.ItemsSource = person; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
public class Person : INotifyPropertyChanged { private string name; private string secondName; private DateTime dateTime; public string Name { get { return name; } set { name = value; OnPropertyChanged("Name"); } } public string SecondName { get { return secondName; } set { secondName = value; OnPropertyChanged("SecondName"); } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName]string prop = "") { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(prop)); } } }

877 / 556 / 291
Регистрация: 21.11.2012
Сообщений: 1,552

я бы сделал так.. для начала нужно сделать свойство, которое бы отвечало за отображение текста «введите что-то:». Есть 2 способа. Первый сделать кастомный текстбокс, второй с помощью attachedproperty. я покажу решиние со вторым..
для начала создадим такое свойство:

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public static class AttachesProperties { public static string GetDefaultText(DependencyObject obj) { return (string)obj.GetValue(DefaultTextProperty); } public static void SetDefaultText(DependencyObject obj, string value) { obj.SetValue(DefaultTextProperty, value); } // Using a DependencyProperty as the backing store for DefaultText. This enables animation, styling, binding, etc. public static readonly DependencyProperty DefaultTextProperty = DependencyProperty.RegisterAttached("DefaultText", typeof(string), typeof(AttachesProperties)); }

теперь определим стиль для текстбокса. Отображением текста будет заниматься текстблок:

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
 x:Key="TextBox.Static.Border" Color="#FFABAdB3"/>  x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>  x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>  x:Key="TextBoxStyle1" TargetType="">  Property="Background" Value=">"/>  Property="BorderBrush" Value=""/>  Property="Foreground" Value=">"/>  Property="BorderThickness" Value="1"/>  Property="KeyboardNavigation.TabNavigation" Value="None"/>  Property="HorizontalContentAlignment" Value="Left"/>  Property="local:AttachesProperties.DefaultText" Value="Hallo, world!"> >  Property="FocusVisualStyle" Value=""/>  Property="AllowDrop" Value="true"/>  Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>  Property="Stylus.IsFlicksEnabled" Value="False"/>  Property="Template"> >  TargetType="">  x:Name="border" BorderBrush="" BorderThickness="" Background="" SnapsToDevicePixels="True"> >  x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>  Text=">" Margin="2 2 0 0" Foreground="Silver" x:Name="tbDefaultText"> >  Converter="">  Path="Text" RelativeSource=""> >  Path="IsFocused" RelativeSource=""> >  Path="(local:AttachesProperties.DefaultText)" RelativeSource=""> > > > > > > >  Property="IsEnabled" Value="false">  Property="Opacity" TargetName="border" Value="0.56"/> >  Property="IsMouseOver" Value="true">  Property="BorderBrush" TargetName="border" Value=""/> >  Property="IsKeyboardFocused" Value="true">  Property="BorderBrush" TargetName="border" Value=""/>  Property="Visibility" Value="Collapsed" TargetName="tbDefaultText"> > > > > > > > > >  Property="IsInactiveSelectionHighlightEnabled" Value="true"/>  Property="IsSelectionActive" Value="false"/> >  Property="SelectionBrush" Value=">"/> > > >

далее добавляем конвертер для отображения/скрытия текста

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public class DefaultTextConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { var text = values[0]; var isFocused = (bool)values[1]; var defaultText = values[2]; if (isFocused) return Visibility.Collapsed; else if (defaultText == null) return Visibility.Collapsed; else if (text != null && !string.IsNullOrEmpty(text.ToString())) return Visibility.Collapsed; else return Visibility.Visible; } public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }

после того, как создали стиль для текстбокса, используем DataGridTemplateColumn:

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
> >  Header="Name"> > > Text=""/> > > > >  Style="" Text="" local:AttachesProperties.DefaultText="Введите имя:"> > > > > > >

далее при редактировании записи если в ячейке пусто, появится надпись «Введите имя:» пока не введешь что-то

Как сделать подсказку в datagrid

К сожалению, тема относится исключительно к вин-формам в которых вебовские решения не применишь, но у тебя есть как минимум два варианта:
1) Применить достаточно муторное решение через TypeDescriptor, как описано здесь: How To bind a DataGridView column to a second-level property of a datasource
2) Воспользоваться возможностями интерфейса ITypedList, например, через класс BindingSource.

Также рекомендую следующую статью: A detailed databinding tutorial

Сообщ. #7 , 03.11.09, 10:52
Рейтинг (т): 9

Я так понял, что есть общий список источников как справочник и список платежей.
Т.е. в каждой строке грида с платежами при открытии комбобокса выбора источника должен быть один и тот же список источников.
Если так, то

this.dgvCmbSources.DisplayMember = «имя»;
this.dgvCmbSources.ValueMember = «id_источника»;
this.dgvCmbSources.DataSource = сюда присваиваем список источников

Инициализируем это дело по событию Load формы

Где this.dgvCmbSources данный комбобоксный столбец.

Добавлено 03.11.09, 11:06
Извините, не въехал сразу в суть проблемы.

Как вариант можно DataGridView заполнить ручками, так мороки меньше получится.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *