динамические всплывающие подсказки по элементам управления Winforms

Вопрос:

Я ищу самый чистый способ привязать один и тот же источник данных к подсказке элемента управления, которую я привязываю к самому элементу управления. Например, у меня есть строка

control.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true));

где dataFeatures имеет тип BindingSource. Повторяют подобные линии для многих элементов управления на WinForm Form. Некоторые из этих элементов управления могут принимать значения, текст которых может охватывать большую ширину текста, чем то, что видно внутри самого элемента управления. Вместо того, чтобы перепроектировать макет формы для учета возможности частично скрытого текста в некоторых элементах управления в нескольких ситуациях, я хотел бы, чтобы всплывающая подсказка каждого элемента управления была привязана к одному и тому же свойству BindingSource в качестве элемента управления EditValue или Text свойство. Это возможно? Я могу себе представить, что есть способ сделать это вручную, обработав событие EditValueChanged как я уже делаю по разным причинам, но я надеялся, что будет более чистое решение, чем добавлять новые строки кода для каждого элемента управления.

У кого-нибудь есть предложение?

Благодарю!

Лучший ответ:

0. Для элементов управления DevExpress вы можете просто привязать свойство DevExpressControl.ToolTip к тому же значению:

devExpressControl.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true));
devExpressControl.DataBindings.Add(new Binding("ToolTip", dataFeatures, "Key", true, DataSourceUpdateMode.Never));

1. Для стандартных элементов управления WinForms вы можете использовать компонент System.Windows.Forms.ToolTip и его событие ToolTip.Popup. Для каждого ToolTip управления установите его ToolTip на некоторое значение, иначе ToolTip никогда не появится:

control.DataBindings.Add(new Binding("Text", dataFeatures, "Key", true));
toolTip1.SetToolTip(control, "Some value");

Теперь вы можете использовать событие ToolTip.Popup:

private bool _updatingToolTip;

private void toolTip1_Popup(object sender, PopupEventArgs e)
{
    if (_updatingToolTip) return;

    //Get binding for Text property.
    var binding = e.AssociatedControl.DataBindings["Text"];

    if (binding == null) return;

    //Get binding value.
    var manager = binding.BindingManagerBase;
    var itemProperty = manager.GetItemProperties().Find(binding.BindingMemberInfo.BindingField, true);

    object value = itemProperty.GetValue(manager.Current);
    string toolTipText;

    if (value == null || string.IsNullOrEmpty(toolTipText = value.ToString()))
    {
        e.Cancel = true;

        return;
    }

    //Update ToolTip text.
    _updatingToolTip = true;
    toolTip1.SetToolTip(e.AssociatedControl, toolTipText);
    _updatingToolTip = false;
}

Ответ №1

Вы можете легко реализовать динамические всплывающие подсказки с помощью компонента ToolTipController. Поместите этот компонент в форму и назначьте каждому редактору с помощью свойства BaseControl.ToolTipController.

Когда это будет сделано, вы можете обработать событие ToolTipController.BeforeShow и изменить текст в соответствии с состоянием управления. Активное управление передается через свойство SelectedControl параметра события.

Оцените статью
TechArks.Ru
Добавить комментарий