Combobox SelectedItem的不确定响应

时间:2012-12-01 10:28:35

标签: c# winforms combobox

我正在使用winform并使用组合框。

我在此序列中设置了组合框的属性

combobox.DisplayMember 
combobox.ValueMember 
combobox.DataSource 

绑定代码

   private void BindBranch()
    {
        BranchClass branch = new BranchClass();
        branch.Active = true;
        branch.Company = Startup.CompID;
        if (branch.GetAll(out dtBranch, out result))
        {
            cmbBranch.DisplayMember = "br_name";
            cmbBranch.ValueMember = "br_id";
            cmbBranch.DataSource = dtBranch;
        }
        else
        {
            MessageBox.Show(result);
        }
    }

我在我的应用程序中多次使用过combobox,我不知道我在哪里犯了错误

  

Sometime SelectedItem属性返回精确值(int,string)   在“ValueMember”属性的数据类型上,但有时它返回   “DataRowView”,在这种情况下抛出InvalidCastException。

我读过这是因为在组合框中设置属性的顺序。但现在情况并非如此。

绑定代码是

enter image description here

调用代码

private void BindEmployee() 
{
    employee.Branch = Convert.ToInt32(cmbBranch.SelectedItem); // InvalidCastException thrown here
    employee.Active = true;

    var dt = new DataTable();
    if (employee.GetEmployee(out dt, out result, false))
    {
        cmbEmployee.DisplayMember = "emp_name";
        cmbEmployee.ValueMember = "emp_id";
        cmbEmployee.DataSource = dt;
    }
}

4 个答案:

答案 0 :(得分:0)

这是从ComboBox中获取所选DataRowView的方法

由于您使用数据绑定来填充组合框。在这种情况下,使用组合框的SelectedItem属性。它可能包含一个DataRowView,因此您可以使用这样的代码。

DataRowView viewRow = (DataRowView)cmbBranch.SelectedItem;
DataRow row = viewRow.Row;

答案 1 :(得分:0)

解决方法可以是检查cmbBranch.SelectedItem返回的类型,如下所示:

object item = cmbBranch.SelectedItem;
int branchId;
if (item is int)
   branchId = item as int;
else if (item is DataRowView)
   branchId = Convert.ToInt32(((DataRowView)item)["BR_ID"].ToString());

我不确定这是否是有效的解决方案,但可以解决方法!

答案 2 :(得分:0)

我假设你在br_id之后。你试过了吗?

employeeBranch = ConvertToInt32(cmBranch.SelectedValue);

答案 3 :(得分:0)

如果您希望br_id使用SelectedValue代替SelectedItem

int id = (int)cmBranch.SelectedValue;

SelectedValue返回ValueMember指定的属性的值。 SelectedItem应始终返回数据行。