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
。