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

Другие вопросы по тегам