簡體   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