ListControl.DataSource 在 ToolStipControlHost 中不起作用
ListControl.DataSource in ToolStipControlHost not function
我使用 ToolStripControlHost 包装一个 ListBox 控件以将其添加到 ToolStripDropDown 中,但发现我分配给 ListBox.DataSource 的项目没有显示,而且 ComboBox.DataSource 也不起作用,我不知道不明白为什么 ListContorl.DataSource 在 ToolStripControlHost 中不起作用。
ListBox listBox = new ListBox();
listBox.DataSource = new string[] { "1", "2", "3" };
ToolStripControlHost host = new ToolStripControlHost(listBox)
{
Margin = Padding.Empty,
Padding = Padding.Empty,
AutoSize = false
};
ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = false };
dropDown.Items.Add(host);
dropDown.Show();
编辑
我发现问题是 ToolStripDropDown 没有父级提供 BindingContext,所以它会发生在任何带有 DataManager 的控件上。
好问题。似乎必须将 ListBox
添加到顶级控件(例如 Form
)才能强制其使用 DataSource
属性。例如。在分配 DataSource
后添加此代码:
public class DataForm : Form {
ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = true };
ListBox listBox = new ListBox();
public DataForm() {
listBox.DataSource = new string[] { "1", "2", "3" };
var hWnd = listBox.Handle; // required to force handle creation
using (var f = new Form()) {
f.Controls.Add(listBox);
f.Controls.Remove(listBox);
}
ToolStripControlHost host = new ToolStripControlHost(listBox) {
Margin = Padding.Empty,
Padding = Padding.Empty,
AutoSize = false
};
dropDown.Items.Add(host);
}
protected override void OnMouseClick(MouseEventArgs e) {
base.OnMouseClick(e);
dropDown.Show(Cursor.Position);
}
}
您还可以查看 ListBox.cs
源代码以尝试找出根本原因:http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ListBox.cs,03c7f20ed985c1fc
我发现问题是 ToolStripDropDown 没有父级提供 BindingContext,所以解决方案是分配 Form 的 BindingContext。
ListBox listBox = new ListBox();
listBox.DataSource = new string[] { "1", "2", "3" };
listBox.BindingContext = this.BindingContext; //assign a BindingContext
ToolStripControlHost host = new ToolStripControlHost(listBox)
{
Margin = Padding.Empty,
Padding = Padding.Empty,
AutoSize = false
};
ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = false };
dropDown.Items.Add(host);
dropDown.Show();
我使用 ToolStripControlHost 包装一个 ListBox 控件以将其添加到 ToolStripDropDown 中,但发现我分配给 ListBox.DataSource 的项目没有显示,而且 ComboBox.DataSource 也不起作用,我不知道不明白为什么 ListContorl.DataSource 在 ToolStripControlHost 中不起作用。
ListBox listBox = new ListBox();
listBox.DataSource = new string[] { "1", "2", "3" };
ToolStripControlHost host = new ToolStripControlHost(listBox)
{
Margin = Padding.Empty,
Padding = Padding.Empty,
AutoSize = false
};
ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = false };
dropDown.Items.Add(host);
dropDown.Show();
编辑
我发现问题是 ToolStripDropDown 没有父级提供 BindingContext,所以它会发生在任何带有 DataManager 的控件上。
好问题。似乎必须将 ListBox
添加到顶级控件(例如 Form
)才能强制其使用 DataSource
属性。例如。在分配 DataSource
后添加此代码:
public class DataForm : Form {
ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = true };
ListBox listBox = new ListBox();
public DataForm() {
listBox.DataSource = new string[] { "1", "2", "3" };
var hWnd = listBox.Handle; // required to force handle creation
using (var f = new Form()) {
f.Controls.Add(listBox);
f.Controls.Remove(listBox);
}
ToolStripControlHost host = new ToolStripControlHost(listBox) {
Margin = Padding.Empty,
Padding = Padding.Empty,
AutoSize = false
};
dropDown.Items.Add(host);
}
protected override void OnMouseClick(MouseEventArgs e) {
base.OnMouseClick(e);
dropDown.Show(Cursor.Position);
}
}
您还可以查看 ListBox.cs
源代码以尝试找出根本原因:http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ListBox.cs,03c7f20ed985c1fc
我发现问题是 ToolStripDropDown 没有父级提供 BindingContext,所以解决方案是分配 Form 的 BindingContext。
ListBox listBox = new ListBox();
listBox.DataSource = new string[] { "1", "2", "3" };
listBox.BindingContext = this.BindingContext; //assign a BindingContext
ToolStripControlHost host = new ToolStripControlHost(listBox)
{
Margin = Padding.Empty,
Padding = Padding.Empty,
AutoSize = false
};
ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = false };
dropDown.Items.Add(host);
dropDown.Show();