我正在寻找最简洁的方法将相同的数据源绑定到控件的工具提示,我将绑定到控件本身。例如,我有一行
control.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true));
其中dataFeatures
的类型为BindingSource
。我在WinForm
Form
上为许多控件重复了类似的行。其中一些控件可以采用其文本可以跨越文本宽度的值,而不是控件本身可见的值。我希望将每个控件的工具提示绑定到BindingSource
的相同属性,而不是重新设计表单的布局以解决在某些情况下某些控件中部分隐藏文本的可能性。控制'EditValue
或Text
属性。这可能吗?我可以想象有一种方法可以通过处理EditValueChanged
事件来手动完成,就像我已经做的那样,出于不同的原因,但我希望有一个更清晰的解决方案,而不是为每个控件添加新的代码行
有人有建议吗?
谢谢!
答案 0 :(得分: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;
}
答案 1 :(得分:0)
您可以使用ToolTipController组件轻松实现动态工具提示。将此组件放在Form上,并通过BaseControl.ToolTipController属性分配给每个编辑器。
完成后,您可以处理ToolTipController.BeforeShow事件并根据控件状态更改文本。活动控件通过事件参数的SelectedControl属性传递。