C#WinForms中的动态组合框列表数据绑定

时间:2016-03-10 12:18:22

标签: c# winforms data-binding combobox

已经阅读了很多这个资源并且非常喜欢它,但现在我遇到了一个问题,我既不能自己解决也不能找到类似的解决方案。 我使用的是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,不Contractor本身),而组合框的IDSelectedValueSelectedItem正确更改。 为什么?我该怎么做才能使这个工作。

1 个答案:

答案 0 :(得分: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;
            }
        }
    }
}

可能会对某人有所帮助。