ListControl.DataSource в ToolStipControlHost не работает
Я использую 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.
2 ответа
Я обнаружил, что проблема заключается в том, что ToolStripDropDown не имеет родителей для предоставления BindingContext, поэтому решение заключается в назначении 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();
Хороший вопрос. Похоже на 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