2

我使用 ToolStripControlHost 包装 ListBox 控件以将其添加到 ToolStripDropDown 中,但发现我分配给 ListBox.DataSource 的项目没有显示,并且 ComboBox.DataSource 也不能正常工作,我不明白为什么 ListContorl.DataSource 不能正常工作工具条控制主机。

        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 的控件上。

4

2 回答 2

1

好问题。似乎ListBox必须将其添加到顶级控件(例如 a 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

于 2015-10-06T03:41:54.193 回答
0

我发现问题是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();
于 2015-10-27T03:13:05.673 回答