在ToolStrip上发出DataBinding控件

时间:2011-02-06 03:27:41

标签: c# .net winforms data-binding

在此代码之后......

var cb = new CheckBox();
var b = new Binding("Text", new Form1.Foo() { Bar = "Hello World!" }, "Bar");
cb.DataBindings.Add(b);
AddCheckBoxToForm(cb);

...我的表格上有一个带有Text =“”的CheckBox。我期待Text成为“Hello World!”。 Foo是Form1和Foo中的公共类.Bar是一个具有公共get和public set的属性,btw。我不理解的是什么?

:: Updated ::上面的代码实际上有效。仅当CheckBox位于ToolStrip上时才会出现此问题。请参阅下文,了解该问题的真实示例。

感谢。

4 个答案:

答案 0 :(得分:1)

我想我可能已经找到了你的问题。该解决方案已经在this线程的第一个响应中得到了有效的总结。

后人:

  

这里有两个困难:

     
      
  1. 首先,附加了“ToolStripTextBox”   “ToolStripDropDownButton”可能不是   真正创造(句柄等)   当我们添加数据绑定时。数据   这里的绑定只能在这里工作   控件已经创建。该   控制通常会在何时创建   它显示。另一方面,   附加到“ToolStipTextBox”   直接“ToolStrip”,它总是如此   在UI上可见,因此它肯定是   创建。要解决这个问题,我们可以   使用以下代码强制执行   创建“TextBox”控件   在添加数据绑定之前。

        this.toolStripDropDownButton1.ShowDropDown();
        this.toolStripDropDownButton1.HideDropDown();
    
  2.   
  3. 其次,如果我们将“ToolStripTextBox”附加到   “ToolStripDropDownButton”,其父级   连锁被打破了。你可以看到   “toolStipTextBox1.TextBox.Parent”是   “System.Windows.Forms.ToolStripDropDownMenu”   和它的祖父母(例如   “toolStipTextBox1.TextBox.Parent.Parent”)   一片空白。由于母链是   坏了,TextBox.BindingContext就可以了   不再参考现有的   BindingContext在main中定义   形成。因此我们需要创造自己的   的BindingContext:

         this.toolStripTextBox1.TextBox.BindingContext = new BindingContext();   
    
  4.         

    因此,您可以完整地尝试以下代码:

            this.toolStripDropDownButton1.ShowDropDown();
            this.toolStripDropDownButton1.HideDropDown();
            this.toolStripTextBox1.TextBox.BindingContext = new BindingContext();
            this.toolStripTextBox1.TextBox.DataBindings.Add("Text", TableClass.get_TBA().DefaultView, "ID");
    

答案 1 :(得分:1)

非常感谢Quibblesome!我可以将我的示例中的foreach替换为下面的foreach,它可以按预期工作。很好。

        foreach (var item in list)
        {
            var cb = new CheckBox();
            dropDown.AddControl(cb);

            var b = new Binding("Text", item, "text");
            cb.HandleCreated += delegate(object sender, EventArgs e)
            {
                cb.BindingContext = new BindingContext();
                cb.DataBindings.Add(b);
            };
        }

答案 2 :(得分:1)

我在绑定到动态创建的ToolStripTextBox时遇到了同样的问题。我的解决方案与此处发布的解决方案略有不同,我认为有点简单。

我需要一个类来托管基于ContextMenuStrip的动态创建的弹出窗口。我已经在下面列出了相关部分。

如同quibblesome所示,执行此操作涉及两个问题。首先,您必须手动将绑定上下文与弹出对象关联。在我的课程中,我将BindingContext对象从宿主表单传递给我的构造函数,并将其分配给弹出窗口。

其次,与ToolStripTextBox关联的TextBox控件不是在创建ToolStripTextBox的同时创建的(动态创建的ToolStripDropdowns也是如此)。我没有执行建议的Show()/ Hide()操作来强制创建TextBox控件,而是调用TextBox控件的CreateControl()方法来强制创建它。这样做对我来说似乎有点清洁。

public class DevicePopup
{
    ContextMenuStrip    m_popup;

    public DevicePopup(BindingContext bindingContext)
    {
        m_popup = new ContextMenuStrip();
        m_popup.BindingContext = bindingContext;

        . . .
    }

    public ToolStripTextBox AddTextBox(object dataSource, string dataProperty)
    {
      ToolStripTextBox textBox = new ToolStripTextBox();
      textBox.Control.CreateControl();
      textBox.TextBox.DataBindings.Add("Text", dataSource, dataProperty);

      . . . 
      return textBox;
    }
}

答案 3 :(得分:0)

我可以避免使用DataBinding并使用System.Reflection作为解决方法,但我真的想知道为什么我的第一个解决方案无效。

这有效:

                foreach (var item in ilist)
                {
                    var cb = new CheckBox();
                    cb.Tag = item;
                    _dropDown.AddControl(cb);

                    //* Todo: Could not get binding to work
                    //var b = new Binding("Text", item, this.DisplayMember);
                    //cb.DataBindings.Add(b);
                    try
                    {
                        cb.Text = item.GetType()
                            .GetProperty(this.DisplayMember ?? string.Empty)
                            .GetValue(item, new object[] { }).ToString();
                    }
                    catch { cb.Text = string.Empty; }

                }