无法将Int转换为int fo组合

时间:2012-10-23 15:53:04

标签: c# .net

我有这个组合框

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'。

3 个答案:

答案 0 :(得分:4)

尝试在SelectedValue属性上调用ToString():

cnaepr=Convert.ToInt32(CmbCnaePrin.SelectedValue.ToString());

错误几乎就是它所说的; SelectedValue属性设计得非常通用,因此它可以是您在DataTable中可以找到的任何内容。它可能是大多数不是“可转换”的类型(实现IConvertible)。

答案 1 :(得分:0)

我能够通过smaple测试应用程序重现您的问题,我可以建议您两种可能的解决方案。

您可以删除BindingSource对象,该对象实际上只是DataTableComboBox之间的代理。

应用此解决方案,代码应如下所示:

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。