首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加到DataSource中时,Listbox ToolStripDropDown无法工作

添加到DataSource中时,Listbox ToolStripDropDown无法工作
EN

Stack Overflow用户
提问于 2018-05-13 03:28:21
回答 1查看 790关注 0票数 1

我为这个问题挣扎了一整天,尽管我找不到解决办法。我为这篇长篇文章道歉,我试着做到简明扼要。

--:我创建了一个Form,在它的类中动态地创建了一个ListBox,并将其DataSource设置为DataTable,如下所示:

代码语言:javascript
复制
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时,列表框是空的(没有显示数据源内容)。

代码语言:javascript
复制
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称为:(简化)

代码语言:javascript
复制
private CtlCombobox LstCountry;
this.LstCountry.Source(dtCountries, "Country", "Country_ID");

正如我所说的,ToolStripDropDown中显示了listBox1,但是列表是空的。奇怪的是,如果我将Source()方法修改为

代码语言:javascript
复制
    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的想法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-13 06:46:10

您需要设置BindingContext属性的ListBox。

当将ListBox (或任何控件)添加到窗体时,它将从窗体继承其BindingContext属性。现在,由于要将ListBox添加到另一个使用.BindingContext == null的TopLevel控件中,所以它不会从表单继承该属性,因此它没有BindingContext

您可以通过为BindingContext创建一个新的ListBox来避免这个问题:

代码语言:javascript
复制
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控件或将其作为参数传递)。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50312495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档