我为这个问题挣扎了一整天,尽管我找不到解决办法。我为这篇长篇文章道歉,我试着做到简明扼要。
--:我创建了一个Form,在它的类中动态地创建了一个ListBox,并将其DataSource设置为DataTable,如下所示:
public partial class FrmAddress : Form
{
private ListBox listBox1 = new ListBox();
public FrmAddress()
{
this.InitializeComponent();
[...]
this.Controls.Add(listBox1);
}
[...]
private void Load_Countries()
{
this.listBox1.DataSource = dtCountries;
this.listBox1.DisplayMember = "Country";
this.listBox1.ValueMember = "Country_ID";
}
[...]
}:创建一个自定义控件(从ToolStripDown继承),创建一个新的ToolStripControlHost(listBox1)实例,将该实例添加到ToolStripDown中。将listBox1.DataSource设置为DataTable。当显示ToolStripDown时,列表框是空的(没有显示数据源内容)。
public class CtlDropdownPopup : ToolStripDropDown
{
ListBox controlToPop;
ToolStripControlHost controlHost;
public CtlDropdownPopup(ListBox controlToPop)
{
this.controlToPop = controlToPop;
this.controlToPop.Location = Point.Empty;
this.controlHost = new ToolStripControlHost(this.controlToPop);
[...]
this.Items.Add(this.controlHost);
}
}
public class CtlCombobox : ComboBox
{
private readonly CtlDropdownPopup suggestionDropDown;
private readonly ListBox suggestionList = new ListBox();
public CtlCombobox()
{
this.suggestionDropDown = new CtlDropdownPopup(this.suggestionList);
}
public void Source(DataTable dt, string display, string value)
{
this.suggestionDT = dt;
this.suggestionList.DataSource = dt;
this.suggestionList.DisplayMember = display;
this.suggestionList.ValueMember = value;
}
}自定义CtlDropdownPopup称为:(简化)
private CtlCombobox LstCountry;
this.LstCountry.Source(dtCountries, "Country", "Country_ID");正如我所说的,ToolStripDropDown中显示了listBox1,但是列表是空的。奇怪的是,如果我将Source()方法修改为
public void Source(DataTable dt, string display, string value)
{
this.suggestionDT = dt;
// this.suggestionList.DataSource = dt;
// this.suggestionList.DisplayMember = display;
// this.suggestionList.ValueMember = value;
if (this.suggestionList != null)
{
foreach (DataRow row in dt.Rows)
{
this.suggestionList.Items.Add(row[display].ToString());
}
}
}列表框中显示了其中的项目。虽然这个解决方法可以完成这项工作,但是找不到为什么我不能直接设置DataSource的答案(就像我在第一个示例中直接做的那样)是很烦人的,但是必须手动添加这些项。
任何想法都能帮助我今晚睡好觉:)
认为#1:我相信,由于同一个dtCountries与其他ComboBox1.DataSource相关联,这可能就是问题所在,所以我希望this.controlToPop.DataSource = dt.Copy();“它不会以某种方式链接到组合框”,但问题还是存在的。
侧备注:我正在尝试创建一个自定义组合框,用于建议DataTable中的项目。
来自https://www.codeproject.com/Tips/789705/Create-combobox-with-search-and-suggest-list的想法
发布于 2018-05-13 06:46:10
您需要设置BindingContext属性的ListBox。
当将ListBox (或任何控件)添加到窗体时,它将从窗体继承其BindingContext属性。现在,由于要将ListBox添加到另一个使用.BindingContext == null的TopLevel控件中,所以它不会从表单继承该属性,因此它没有BindingContext。
您可以通过为BindingContext创建一个新的ListBox来避免这个问题:
public void Source(DataTable dt, string display, string value)
{
this.suggestionDT = dt;
this.suggestionList.BindingContext = new BindingContext(); // <<<<<<<<<<<<<
this.suggestionList.DataSource = dt;
this.suggestionList.DisplayMember = display;
this.suggestionList.ValueMember = value;
}您还可以从表单复制BindingContext (通过CtlCombobox控件或将其作为参数传递)。
希望这能有所帮助。
https://stackoverflow.com/questions/50312495
复制相似问题