2015-10-06 51 views
2

我使用ToolStripControlHost来包装一个ListBox控件以将其添加到ToolStripDropDown中,但发现我分配给ListBox.DataSource的项目未显示出来,而ComboBox.DataSource也不工作,不明白为什么ListContorl.DataSource不能在ToolStripControlHost中运行。ToolStipControlHost中的ListControl.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的任何控制。

回答

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(); 
1

好问题。似乎必须将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

+0

嗨,不好意思,谢谢你的帮忙! 我不能通过在分配DataSource之后添加此代码来实现它,你能否给我一个提示哪一行应该以ListBox.cs开始? – Cason

+0

@Cason对不起,我忘了包含一个重要的行,它是:'var hWnd = listBox.Handle;'这看起来好像什么也没做,但实际上访问'Handle'属性会导致创建'Handle'。完整的代码已发布。 – Loathing

+0

谢谢,Loathing〜完美的作品! – Cason

相关问题