3

我有这个组合框

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

4

3 回答 3

4

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

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

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

于 2012-10-23T15:57:45.220 回答
0

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

您可以删除BindingSource实际上只是 和 之间的代理DataTable的对象ComboBox

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

CmbCnaePrin.DataSource = llenar.Tables["cnae"];
CmbCnaePrin.DisplayMember = "cnae_descricao";
CmbCnaePrin.ValueMember = "cnae_id";

其余的可以不变,你应该StringCmbCnaePrin.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);
}

其余的可以保持不变。

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

于 2012-10-23T16:24:09.277 回答
0

在分配 DataSource 之前尝试设置组合框 DisplayMember 和 ValueMember。

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

我认为在设置 DataSource 之后分配这些意味着组合框正在尝试使用 DataTable 的默认迭代器,它是 DataRow (或在这种情况下 DataView 上的 DataRowView )。因此,它会在分配之前自行设置 ValueMember 和 DisplayMember。

于 2012-10-23T17:54:58.257 回答