首页 文章

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

提问于
浏览
0

已经阅读了很多这个资源并且非常喜欢它,但是现在我遇到了一些问题,我既不能自己解决也不能找到类似的解决方案 . 我正在使用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是不可覆盖的,所以我决定继承combobox并在其中创建一个名为“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;
                        }
                    }

                }
            }

所以,这段代码工作正常 . 我可以加载表格, Contract 对象和承包商列表,并在组合框中获得正确的承包商名称 . 但 . 我有支持“ID”属性绑定的问题 . 当组合框中的承包商更改时,合并对象不会更新( ContractorID ,没有 Contractor 本身),而组合框的 IDSelectedValueSelectedItem 正确更改 . 为什么?我该怎么做才能使这个工作 .

1 回答

  • 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;
                }
            }
        }
    }
    

    可能会对某人有所帮助 .

相关问题