Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms控件上的动态工具提示_Winforms_Binding_Devexpress_Tooltip_Devexpress Windows Ui - Fatal编程技术网

Winforms控件上的动态工具提示

Winforms控件上的动态工具提示,winforms,binding,devexpress,tooltip,devexpress-windows-ui,Winforms,Binding,Devexpress,Tooltip,Devexpress Windows Ui,我正在寻找最干净的方法将同一数据源绑定到控件的工具提示,而我正在绑定到控件本身。例如,我有这条线 control.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true)); 其中,dataFeatures的类型为BindingSource。我对WinForm表单上的许多控件重复了类似的行。其中一些控件可以采用一些值,这些值的文本宽度可以大于控件本身中可见的文本宽度。我希望将每个控件的工具提示绑定到与控件的Edit

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

control.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true));
其中,
dataFeatures
的类型为
BindingSource
。我对
WinForm
表单上的许多控件重复了类似的行。其中一些控件可以采用一些值,这些值的文本宽度可以大于控件本身中可见的文本宽度。我希望将每个控件的工具提示绑定到与控件的
EditValue
text
属性相同的
BindingSource
属性,而不是重新设计表单布局,以考虑在某些情况下某些控件中部分隐藏文本的可能性。这可能吗?我可以想象有一种方法可以通过手动处理
EditValueChanged
事件来实现,就像我出于不同的原因已经做过的那样,但我希望有一种更干净的解决方案,而不是为每个控件添加新的代码行

有人有什么建议吗


谢谢

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


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

0。对于DevExpress控件,您可以将属性绑定到相同的值:

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

1.对于标准WinForms控件,可以使用组件及其事件。对于每个控件,将其
工具提示
设置为某个值,否则将永远不会显示
工具提示

control.DataBindings.Add(new Binding("Text", dataFeatures, "Key", true));
toolTip1.SetToolTip(control, "Some value");
现在您可以使用
工具提示。弹出
事件:

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

我已尝试了您建议的内容,但未触发
BeforeShow
事件。所有控件实际上都在一个
LayoutControl
我错误地认为控件从LayoutControl继承了ToolTipController。这对于StyleController组件是正确的,但对于ToolTipController则不是。如果您为每个编辑器指定ToolTipController,并为编辑器的ToolTip属性设置任何值,它将在显示工具提示之前引发BeforeShow事件。哦,好的,不用担心。我试着在其中一个控件上进行测试,但不管出于什么原因,它仍然没有启动BeforeShow事件。我将尝试@nempoBu4的答案,看看它的速度有多快。我真的很感谢你的努力!这很有效。完全有道理。不知道为什么绑定到
EditValue
/
文本
/
属性而不是
工具提示
属性时感觉很舒服。非常感谢。如果您不介意后续问题的话:在我的
LayoutControl
中的所有控件使用您的第一个建议时,只有
LookUpEdit
控件似乎有这种奇怪的行为:它们总是无法通过验证。我没有自己指定的任何验证规则,但一旦我删除了对这些控件工具提示属性的绑定,它们就不会再验证失败……有什么想法吗?@JakeSmith我无法重现这种行为。我已经更新了我的答案,我认为最好使用
DataSourceUpdateMode.Never
模式作为
ToolTip
属性:
devExpressControl.DataBindings.Add(新绑定(“ToolTip”,dataFeatures,“Key”,true,DataSourceUpdateMode.Never))。也许它能帮助你。谢谢@nempoBu4!看来我的问题已经解决了。我读了一下这个枚举:
数据源永远不会更新,输入控件的值也不会被解析、验证或重新格式化。
这只是说它不会解析和验证ToolTip属性吗?或者这是否意味着我的控件会一起避免验证?现在,无论哪种方式,这都很好,但是稍后我可能需要验证分配给控件的EditValue的实际值。再次感谢您的帮助,非常感谢…@JakeSmith是的,它不会只解析和验证
工具提示
属性。将验证所有其他属性,因为默认选项为
DataSourceUpdateMode.OnValidation