在此代码之后......
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上时才会出现此问题。请参阅下文,了解该问题的真实示例。
感谢。
答案 0 :(得分:1)
我想我可能已经找到了你的问题。该解决方案已经在this线程的第一个响应中得到了有效的总结。
后人:
这里有两个困难:
首先,附加了“ToolStripTextBox” “ToolStripDropDownButton”可能不是 真正创造(句柄等) 当我们添加数据绑定时。数据 这里的绑定只能在这里工作 控件已经创建。该 控制通常会在何时创建 它显示。另一方面, 附加到“ToolStipTextBox” 直接“ToolStrip”,它总是如此 在UI上可见,因此它肯定是 创建。要解决这个问题,我们可以 使用以下代码强制执行 创建“TextBox”控件 在添加数据绑定之前。
this.toolStripDropDownButton1.ShowDropDown(); this.toolStripDropDownButton1.HideDropDown();
- 醇>
其次,如果我们将“ToolStripTextBox”附加到 “ToolStripDropDownButton”,其父级 连锁被打破了。你可以看到 “toolStipTextBox1.TextBox.Parent”是 “System.Windows.Forms.ToolStripDropDownMenu” 和它的祖父母(例如 “toolStipTextBox1.TextBox.Parent.Parent”) 一片空白。由于母链是 坏了,TextBox.BindingContext就可以了 不再参考现有的 BindingContext在main中定义 形成。因此我们需要创造自己的 的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");
答案 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; }
}