0

我正在寻找将相同数据源绑定到我绑定到控件本身的控件工具提示的最简洁方法。例如,我有这条线

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

哪里dataFeatures是类型BindingSource。我对 a 上的许多控件重复类似的行WinForm Form。其中一些控件可以采用其文本可以跨越的文本宽度大于控件本身可见的文本宽度的值。我不想重新设计表单的布局以解决某些情况下某些控件中部分隐藏文本的可能性,而是希望将每个控件的工具提示绑定到与BindingSource控件EditValue或属性相同的Text属性。这可能吗?我可以想象有一种方法可以手动处理EditValueChanged事件,就像我出于不同原因已经做过的那样,但我希望有一个比必须为每个控件添加新代码行更简洁的解决方案。

有人有建议吗?

谢谢!

4

2 回答 2

2

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将永远不会出现:

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;
}
于 2014-07-22T05:17:13.567 回答
0

您可以使用ToolTipController组件轻松实现动态工具提示。将此组件放到窗体上,并通过BaseControl.ToolTipController属性分配给每个编辑器。

完成后,您可以处理ToolTipController.BeforeShow事件并根据控件状态更改文本。活动控件通过事件参数的SelectedControl属性传递。

于 2014-07-21T11:58:13.610 回答