【问题标题】:Dynamic combobox list databinding in C# WinFormsC# WinForms 中的动态组合框列表数据绑定
【发布时间】:2016-03-10 12:18:21
【问题描述】:

已经阅读了很多这个资源并且非常喜欢它,但是现在我遇到了我自己既无法解决也无法找到类似解决方案的问题。 我正在使用 C# winforms 和 linqtosql。 在我的用户表单中,我使用额外的视图类来绑定组合框列表,让用户能够获取和使用对象的名称列表,同时禁止获取整个对象本身。 (这不是问题是否是一个好的做法,无论如何。)

例如(这不是真正的代码,只是为了看): ORM 类:

public class Contract
{
    public string ID { get; set; }
    public string Name { get; set; }
    public Contractor Contractor { get; set; }
    public string ContractorID { get; set; }
}
public class Contractor
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
}

这是附加的视图类,用于映射 sqlserver 视图 Contractor_List (SELECT c.ID, c.Name FROM Contractors c)

public class Contractor_List
{
    public string ID { get; set; }
    public string Name { get; set; }
}

用户窗体:

public class ContractForm : Form
{
    void Init()
    {
        TextBox nameBox = new TextBox();
        ComboBox contractorBox = new ComboBox();
        BindingSource contractSource = new BindingSource();
        contractSource.DataSource = typeof (Contract);

        nameBox.DataBindings.Add("Text", contractSource, "Name", false, DataSourceUpdateMode.OnValidation);
        contractorBox.DataBindings.Add("SelectedValue", contractSource, "ContractorID", false, DataSourceUpdateMode.OnValidation);


        BindingSource contractorListSource = new BindingSource();
        contractorListSource.DataSource = typeof (Contractor_List);

        contractorBox.DisplayMember = "Name";
        contractorBox.ValueMember = "ID";
    }

}

好的。 我的想法是在设置contractorBox.SelectedValue 时加载contractorBox.DataSource(它的绑定源)。 我发现 SelectedValue 是不可覆盖的,所以我决定继承组合框并在其中创建一个名为“ID”的新属性并改为执行以下操作 形式:

contractorBox.DataBindings.Add("ID", contractSource, "ContractorID");

在控制中(这是真实的代码):

    object _id;
    bool _listInitialized;
    public object ID
            {
                get
                {
                    return _id;

                }
                set
                {
                    if (!_listInitialized)
                    {
                        var bindingSource = DataSource as BindingSource;
                        if (bindingSource != null)
                        {
                            var t = (bindingSource.DataSource as Type);
                            var rst = … //Getting List
                            if (rst!=null)
                            {
                                bindingSource.DataSource = rst;
                                _listInitialized = true;
                                SelectedValueChanged += delegate {
                                    if (SelectedValue != ID)
                                    {
                                        ID = SelectedValue;
                                    }
                                };
                            }
                        }
                    }
                    else
                    {
                        _id = value;
                        if (SelectedValue != ID)
                        {
                            SelectedValue = value;
                        }
                    }

                }
            }

所以,这段代码运行良好。我可以加载表单、合同对象和承包商列表,并在组合框中获取正确的承包商名称。 但。我在支持“ID”属性绑定时遇到问题。当组合框中的契约者更改时,契约对象不会更新(ContractorID 本身也没有),而组合框的 IDSelectedValueSelectedItem 会正确更改。 为什么?我该怎么做才能让它发挥作用。

【问题讨论】:

  • 请删除“更新”并将其发布为您的答案,并将其标记为答案。这就是我们喜欢在这里滚动的方式! :)

标签: c# winforms data-binding combobox


【解决方案1】:

哈。如此简单的解决方案。

public new object SelectedValue
{
    get
    {
        return base.SelectedValue;

    }
    set
    {
        if (!DesignMode)
        {
            if (!_listInitialized)
            {
                var bindingSource = DataSource as BindingSource;
                if (bindingSource != null)
                {
                    var t = (bindingSource.DataSource as Type);
                    var rst = ...///how you get your type list
                    if (rst != null)
                    {
                        bindingSource.DataSource = rst;
                        _listInitialized = true;
                    }
                }
            }
            else
            {
                base.SelectedValue = value;
            }
        }
    }
}

可能会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多