C# Can';t将Int转换为Int-fo组合

C# Can';t将Int转换为Int-fo组合,c#,.net,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

我有这个组合框

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”类型。

尝试调用SelectedValue属性上的ToString()

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

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

我可以用一个简单的测试应用程序重现您的问题,我可以向您推荐两种可能的解决方案

您可以删除
BindingSource
对象,该对象实际上只是
DataTable
组合框之间的代理

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

CmbCnaePrin.DataSource = llenar.Tables["cnae"];
CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";
DataRowView selectedValue = (CmbCnaePrin.SelectedValue as DataRowView);
if (selectedValue != null)
{
    cnaepr = Convert.ToInt32(selectedValue.Row["cnae_id"]);
}
else
{
    cnaepr = Convert.ToInt32(CmbCnaePrin.SelectedValue);
}
其余部分可以保持不变,您应该在
cmbcnaprin.SelectedValue
中获得一个
String
对象

替代解决方案(更新)

或者,您可以使用BindingSource,但在直接获取值时,可以处理在
CMBCNAPRIN.SelectedValue
中返回的
DataRowView
,以及案例

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

CmbCnaePrin.DataSource = llenar.Tables["cnae"];
CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";
DataRowView selectedValue = (CmbCnaePrin.SelectedValue as DataRowView);
if (selectedValue != null)
{
    cnaepr = Convert.ToInt32(selectedValue.Row["cnae_id"]);
}
else
{
    cnaepr = Convert.ToInt32(CmbCnaePrin.SelectedValue);
}
其余的可以保持不变


让我知道这是否解决了您的问题。

在分配数据源之前,请尝试设置组合框DisplayMember和ValueMember

CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";
CmbCnaePrin.DataSource = srd;

我认为在设置数据源之后分配这些值意味着combobox试图使用DataTable的默认迭代器,DataTable是DataRow(在本例中是DataView上的DataRowView)。因此,在分配ValueMember和DisplayMember之前,它会自行设置它们。

双负数有什么用?这是否意味着您实际上可以转换为int?注意:如果
CmbCnaePrin.SelectedValue
DataRowView
类型,使用
ToString()
方法将为您提供带有
System.Data.DataRowView
值的字符串,该值仍然无法解析为
int
。第一行有效(无错误),第二行无效,继续错误。你写了第一个解决方案有效,解决你的问题也有效吗?请注意,我还更新了第二个,请看一看。