ComboBox的SelectedValue未设置

时间:2013-08-08 06:50:39

标签: c# winforms

我的组合框名称为cmbContactType。我将此组合与dataSource绑定为DisplayMember ValueName(字符串类型),将valueMember绑定为ValueID(数字类型)。当用户在cmbContactType中更改值时,cmbContactType.SelectValue得到设置,我可以使用此Selectedvalue保存文档。我从数据库中设置cmbContactType值时遇到问题。每次我尝试设置值时,null值都会设置为cmbContactType.SelectValue。 以下是我将数据源绑定到cmbContactType以及设置cmbContactType的SelectedValue的代码。我正在使用VS2010和MS-Access。请帮忙。

    //method to bind dataSource.
    public static void BindDataSourceWithCombo(ref ComboBox cmb, string query, string valueMember, string displayMember)
    {
        DataTable _tableSource = (new AccessConnectionManager()).GetDataTableBySQLQuery(query);

        var _dataSource = (from DataRow _row in _tableSource.Rows
                           select new
                           {
                               ValueMember = _row[valueMember],
                               DisplayMember = _row[displayMember].ToString()

                           }).ToList();

        cmb.DisplayMember = "DisplayMember";
        cmb.ValueMember = "ValueMember";
        cmb.DataSource = _dataSource;
    }

    // Method to set values in document.
    public void SetDocumentProperties()
    {
        string _query = string.Format("Select ContactCode,ContactName,ContactType from ContactMaster where ContactCode = '{0}'", Convert.ToString(cmbContactCode.Text));
        DataTable _table = AccessConnectionManagers.GetDataTableBySQLQuery(_query);

        if (_table.Rows.Count > 0)
        {
            DataRow _row = _table.Rows[0];
            txtContactCode.Text = Convert.ToString(_row["ContactCode"]);
            txtContactName.Text = Convert.ToString(_row["ContactName"]);
            cmbContactType.SelectedValue = _row["ContactType"];
        }
        else
        {
            txtContactCode.Text = string.Empty;
            txtContactName.Text = string.Empty;
            cmbContactType.SelectedValue = 1;
        }
    }

以下是使用cmbConactType绑定dataSource的代码。此方法调用Form_Load事件。

    private void LoadContactTypeCombo()
    {
        //Table: PicklistValues(ID,MasterID,ValueID,ValueName) 
        string _query = string.Format("select ValueID,ValueName from PicklistValues where MasterID = {0}", 1);
        BindDataSourceWithCombo(ref cmbContactType, _query, "ValueID", "ValueName");
    }

3 个答案:

答案 0 :(得分:3)

尝试这种方法

int index;
// Search the Item that matches the string
index=cmbContactType.FindString(_row["ContactType"]);
// Select the Item in the Combo
cmbContactType.SelectedIndex=index;

答案 1 :(得分:2)

您应该注意到ValueMember中实际DataSource的类型,在将SelectedValue分配给某个值时,它应该可以转换为实际ValueMember的类型在你的DataSource中。

您必须确保_row["ContactType"]的商品值必须包含cmbContactType。如果不是,SelectedItem将为空。您应该执行一些检查,看看它是否有帮助。

答案 2 :(得分:0)

最后我找到了解决问题的方法,当我查找cmbContactType.SelectedValue类型时,我发现它是int16的类型...!并使用以下语句cmbContactType.SelectedValue get set。

cmbContactType.SelectedValue =_row["ContactType"] != null ? Convert.ToInt16(_row["ContactType"]) : (Int16)(-1) ;