2012-10-23 37 views
3

我有这样的组合框无法转换诠释为int FO组合

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

什么是双重否定?这是否意味着你实际上可以转换为int?附: [请不要在标题中包含C#](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) – Kiril

回答

4

尝试在SelectedValue属性调用toString():

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

的错误是非常正是它说; SelectedValue属性被设计为非常通用,因此它可以是任何可以在DataTable中找到的任何东西。其中大部分可能不是“可转换”类型(实现IConvertible)。

+0

如果'CmbCnaePrin.SelectedValue'属于' DataRowView'类型,使用'ToString()'方法将给你你带有'System.Data.DataRowView'值的字符串,它仍然无法被解析为'int'。 –

0

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

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

应用该解决方案,代码应该是这样的:

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

其余的都可以保持不变,你应该在CmbCnaePrin.SelectedValue得到String对象。

替代解决方案(更新)

或者,你可以使用的BindingSource,但处理返回的CmbCnaePrin.SelectedValueDataRowView,以及情况下,当你直接获得的价值。

应用该解决方案,代码应该是这样的:

DataRowView selectedValue = (CmbCnaePrin.SelectedValue as DataRowView); 
if (selectedValue != null) 
{ 
    cnaepr = Convert.ToInt32(selectedValue.Row["cnae_id"]); 
} 
else 
{ 
    cnaepr = Convert.ToInt32(CmbCnaePrin.SelectedValue); 
} 

其余的都可以保持不变。

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

+0

第一行工作(没有错误),第二行不行,连续错误。 –

+0

你写道,第一个解决方案的工作,那么解决你的问题呢?请注意我也更新了第二个,所以看看它。 –

+0

替代解决方案已更新,它现在应该可以正常工作。 –

0

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

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

我觉得这些分配设置DataSource后,意味着该组合框正试图用一个DataTable的默认迭代器是一个DataRow(或DataRowView的一个数据视图在这种情况下)。因此,在分配它们之前,它将自行设置ValueMember和DisplayMember。

相关问题