我有这个组合框
BindingSource srd = new BindingSource();
srd.DataSource = llenar.Tables["cnae"];
CmbCnaePrin.DataSource = srd;
CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";
我想加载此
int cnaepr;
DataTable dt3 = new DataTable();
dt3 = ifd.cnaeclas(cnaepr);
txtCnaeC.Text = dt3.Rows[0][2].ToString();
txtCnaeSC.Text = dt3.Rows[0][3].ToString();
但我无法转换
cnaepr=Convert.ToInt32(CmbCnaePrin.SelectedValue)
返回此错误无法转换类型为' System.Data.DataRowView'的对象输入' System.IConvertible'。
答案 0 :(得分:4)
尝试在SelectedValue属性上调用ToString():
cnaepr=Convert.ToInt32(CmbCnaePrin.SelectedValue.ToString());
错误几乎就是它所说的; SelectedValue属性设计得非常通用,因此它可以是您在DataTable中可以找到的任何内容。它可能是大多数不是“可转换”的类型(实现IConvertible)。
答案 1 :(得分:0)
我能够通过smaple测试应用程序重现您的问题,我可以建议您两种可能的解决方案。
您可以删除BindingSource
对象,该对象实际上只是DataTable
和ComboBox
之间的代理。
应用此解决方案,代码应如下所示:
CmbCnaePrin.DataSource = llenar.Tables["cnae"];
CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";
其余内容可以保持不变,您应该在String
中获得CmbCnaePrin.SelectedValue
个对象。
替代解决方案(已更新)
或者,您可以使用BindingSource,但在DataRowView
处理CmbCnaePrin.SelectedValue
,以及直接获取值时的情况。
应用此解决方案,代码应如下所示:
DataRowView selectedValue = (CmbCnaePrin.SelectedValue as DataRowView);
if (selectedValue != null)
{
cnaepr = Convert.ToInt32(selectedValue.Row["cnae_id"]);
}
else
{
cnaepr = Convert.ToInt32(CmbCnaePrin.SelectedValue);
}
其余的可以保持不变。
如果这解决了您的问题,请告诉我。
答案 2 :(得分:0)
在分配DataSource之前,请尝试设置组合框DisplayMember和ValueMember。
CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";
CmbCnaePrin.DataSource = srd;
我认为在设置DataSource之后分配它们意味着组合框试图使用DataTable的默认迭代器,DataTable是DataRow(在这种情况下是DataView上的DataRowView)。因此,在分配之前,它会自己设置ValueMember和DisplayMember。