如何查找绑定到winform文本框的对象



我有一个文本框,一个对象绑定到该文本。在代码中,我需要找到绑定了哪个对象。

我使用的是Windows.Forms.TextBox,我将DataBinding Text绑定到任何对象名称字段。这是在设计时完成的。在代码中,我需要弄清楚绑定到这个TextBox的对象是什么。

尝试在运行时查询文本框的DataBindings属性。

在运行时的代码中,假设绑定对象是某个MyObject:

if (textBox1.DataBindings.Count == 1)
{
   var myObj = textBox1.DataBindings[0].DataSource as MyObject;
   if (myObj != null)
      // do something with the bound object
   else
      // well, found data bound object but it was not a MyObject... Handle as appropriate
}

希望这能有所帮助。

以防万一还有人需要知道:textBox1.DataBindings("Text").BindingMemberInfo.BindingField
Tim

对象是否存储在Textbox的标记中?

object o = textbox.Tag;

查询文本框的DataBindingsBindingDataSource可以包含不同的东西:

  • 描述属性可以绑定到的对象类型的Type对象。当加载表单时,还没有附加任何对象时,可能会出现这种情况
  • 一个BindingSource。在这种情况下,我们必须查询该绑定源的DataSource
  • 一个数据对象或null

如果我们有一个BindingSource,我们可以再次有一个Type对象。为了获得绑定应该绑定到的对象类型,我编写了这个递归调用自己的助手方法(使用C#7.0语法)

private Type GetBoundType(object dataSource)
{
    switch (dataSource) {
        case Type type:
            return type;
        case BindingSource bindingSource:
            return GetBoundType(bindingSource.DataSource);
        default:
            return dataSource?.GetType();
    }
}

您可以这样称呼它(使用C#7.0语法):

Binding binding = textBox.DataBindings["Text"];
if (binding != null && GetBoundType(binding.DataSource) == expectedType) {
    ...
}

如果你知道一个实际的数据对象已经绑定到数据源,你可以用来获取它

object entity = binding.DataSource is BindingSource bs ? bs.DataSource : binding.DataSource;

最新更新