3

我正在使用 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);
        }
    }

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

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

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

绑定代码是

在此处输入图像描述

调用代码是

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

4 回答 4

0

我假设你在br_id. 你有没有尝试过:

employeeBranch = ConvertToInt32(cmBranch.SelectedValue);
于 2012-12-01T11:18:13.003 回答
0

A workaround can be to check what type is returned by cmbBranch.SelectedItem as below:

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());

I am not sure if this is the efficient solution, but can be a workaround!

于 2012-12-01T11:05:39.497 回答
0

如果你想br_id使用SelectedValue而不是SelectedItem.

int id = (int)cmBranch.SelectedValue;

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

于 2012-12-04T17:04:24.630 回答
0

这是您从 ComboBox 获取所选 DataRowView 的方式

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

DataRowView viewRow = (DataRowView)cmbBranch.SelectedItem;
DataRow row = viewRow.Row;
于 2012-12-01T10:45:40.347 回答