繁体   English   中英

在ToolStrip上发布数据绑定控件

[英]Issue DataBinding Controls on a ToolStrip

这段代码之后...

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

...我在窗体上使用Text =“”得到一个CheckBox。 我期望文本是“ Hello World!”。 Foo是Form1中的公共类,而Foo.Bar是具有公共属性btw的属性。 我不明白什么?

::更新::上面的代码实际上有效。 仅当CheckBox位于ToolStrip上时,才会出现此问题。 有关此问题的真实示例,请参见下文。

谢谢。

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

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

奇怪的是,这样做涉及两个问题。 首先,您必须手动将绑定上下文与弹出对象关联。 在我的课程中,我将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;
    }
}

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

对于后代:

这里有两个困难:

  1. 首先,附加到“ ToolStripDropDownButton”的“ ToolStripTextBox”可能尚未真正创建(句柄等),但是当我们添加数据绑定时。 如果控件已经创建,则此处的数据绑定仅在此处起作用。 该控件通常在显示时创建。 另一方面,对于直接附加到“ ToolStrip”的“ ToolStipTextBox”,它始终在UI上可见,因此可以确定创建。 要解决此问题,我们可以使用以下代码在添加数据绑定之前强制创建“ TextBox”控件。

      this.toolStripDropDownButton1.ShowDropDown(); this.toolStripDropDownButton1.HideDropDown(); 
  2. 其次,如果将“ ToolStripTextBox”附加到“ ToolStripDropDownButton”,则其父链断开。 您可以看到“ toolStipTextBox1.TextBox.Parent”为“ System.Windows.Forms.ToolStripDropDownMenu”,其祖父母(例如“ toolStipTextBox1.TextBox.Parent.Parent”)为空。 由于父链已断开,因此TextBox.BindingContext不再引用主窗体中定义的现有BindingContext。 因此,我们需要创建自己的BindingContext:

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

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

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

非常感谢Quibblesome! 我可以将示例中的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);
            };
        }

我可以避免使用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; }

                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM