[英]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;
}
}
我想我可能已經找到您的問題了。 該解決方案已在對該線程的第一次響應中得到了有效總結。
對於后代:
這里有兩個困難:
首先,附加到“ ToolStripDropDownButton”的“ ToolStripTextBox”可能尚未真正創建(句柄等),但是當我們添加數據綁定時。 如果控件已經創建,則此處的數據綁定僅在此處起作用。 該控件通常在顯示時創建。 另一方面,對於直接附加到“ ToolStrip”的“ ToolStipTextBox”,它始終在UI上可見,因此可以確定創建。 要解決此問題,我們可以使用以下代碼在添加數據綁定之前強制創建“ TextBox”控件。
this.toolStripDropDownButton1.ShowDropDown(); this.toolStripDropDownButton1.HideDropDown();
其次,如果將“ 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.