ComboBox选定项的响应不确定

3

我是一名IT人员,正在使用winform和combobox。

我按照以下顺序设置了combobox的属性:

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,但我不知道我犯了什么错误。有时,根据“ValueMember”属性的数据类型,SelectedItem属性返回确切的值(int,string),但有时它会返回“DataRowView”,在这种情况下,会抛出InvalidCastException异常。
我已经阅读过,这是由于combobox中属性设置的顺序引起的。但现在并非如此。
绑定代码如下: 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;
    }
}

@DJKRAZE 这是一个 WinForm 窗体,当我们将数据源分配给它后,就不需要手动绑定数据。 - user831174
你正在提到 ComboBox.. 但是你所选择的看起来像是 DataGridView.. 你能否更新你的标题或问题以反映这一点。 - MethodMan
@DJKRAZE 这是一个组合框,你现在看到的是数据表可视化工具,你可以在调试监视窗口中查看它。 - user831174
没问题,让我编辑我的回答... - MethodMan
你能发布绑定方法的代码吗?我想知道哪个集合被绑定到组合框中,以及在填充和绑定方面的顺序是什么。 - Ian R. O'Brien
显示剩余2条评论
4个回答

0

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

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

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

没有,它没有起作用。我已经更新了问题并附上了屏幕截图。也许这会对你有所帮助。 - user831174
我知道在这种情况下可以工作,但问题在于不确定性,在一半的情况下,它会给我一个错误,即combobox.selecteditem是int类型,无法转换为datarowview。我想知道在哪种情况下它会返回datarowview,以及在哪种情况下它会基于selecteditem返回int、string或其他数据类型。 - user831174

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

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


这个解决方法肯定能够完成任务,但问题仍然存在,为什么会有这些不同的行为。我已经基于这个解决方法开发了一个应用程序,现在我想要进行逻辑上的移动,而不是试错。 - user831174

0

我猜你想要获取 br_id。你试过了吗:

employeeBranch = ConvertToInt32(cmBranch.SelectedValue);

请验证问题的第二个截图。 - user831174
不确定您的意思?"SelectedValue"将返回"ValueMember",如果选择为空,则SelectedItem将返回基本对象,也许这就是为什么在某些情况下会得到datarow的原因。 - sa_ddam213
我的错,你的回答是正确的,我仍在使用“SelectedItem”而不是“SelectedValue”。谢谢,现在正常工作了。 - user831174
谢谢您的回复,按照您的建议它确实起作用了,但我仍然想搞清楚为什么SelectedItem有时返回实际值,有时返回DataRowView。 - user831174

0

如果你想要使用 br_id,请使用 SelectedValue 而不是 SelectedItem

int id = (int)cmBranch.SelectedValue;

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


谢谢您的回复,根据您的建议它确实有效,但是我仍然想弄清楚为什么SelectedItem有时会返回实际值,而有时会返回Datarowview。 - user831174
你能展示一下你实际上将“SelectedItem”分配给“int”的代码吗? - Olivier Jacot-Descombes
请查看我的问题中的“调用代码”部分。 - user831174
Convert.ToInt32(cmbBranch.SelectedItem) 真的会返回一个非 0int 吗? - Olivier Jacot-Descombes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接