簡體   English   中英

C#WinForms中的動態組合框列表數據綁定

[英]Dynamic combobox list databinding in C# WinForms

已經閱讀了很多該資源並且非常喜歡它,但是現在我遇到了一個問題,既不能自己解決也不能找到類似的解決方案。 我正在使用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;
                        }
                    }

                }
            }

因此,此代碼可以正常工作。 我可以加載表單,合同對象和承包商列表,並在組合框中獲取正確的承包商名稱。 但。 我在支持“ ID”屬性的綁定時遇到問題。 更改組合框內的承包商時,合同對象不會更新( ContractorID ,也沒有Contractor本身),而組合框的IDSelectedValueSelectedItem正確更改。 為什么? 我要怎么做才能使其正常工作。

哈哈 如此簡單的解決方案。

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

可能會對某人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM