[英]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.