C# 我如何解决一个“问题”;“无效卡斯特例外”吗;?

C# 我如何解决一个“问题”;“无效卡斯特例外”吗;?,c#,winforms,casting,C#,Winforms,Casting,在以下代码的运行时,我收到一个“InvalidCastException”: public void PopulateCompetitionFormatDd() { var _competitionFormat = new CompetitionFormatBL(); cbCompetitionFormat.DataSource = _competitionFormat.GetByAllCompetitionFormats(); cbCo

在以下代码的运行时,我收到一个“
InvalidCastException
”:

public void PopulateCompetitionFormatDd()
{
     var _competitionFormat            = new CompetitionFormatBL();
     cbCompetitionFormat.DataSource    = _competitionFormat.GetByAllCompetitionFormats();
     cbCompetitionFormat.ValueMember   = "CompetitionFormatId";
     cbCompetitionFormat.DisplayMember = "CompetitionFormatType";
}
我的C#WinForm代码包含一个组合框,该组合框由数据库填充,代码如下:

public void PopulateCompetitionFormatDd()
{
     var _competitionFormat            = new CompetitionFormatBL();
     cbCompetitionFormat.DataSource    = _competitionFormat.GetByAllCompetitionFormats();
     cbCompetitionFormat.ValueMember   = "CompetitionFormatId";
     cbCompetitionFormat.DisplayMember = "CompetitionFormatType";
}
ValueMember
CompetitionFormatId
)是一个数字列表,
DisplayMember
CompetitionFormatType
)是一个文本字符串。当我在运行时更改此组合框中的项目时,会出现错误“
InvalidCastException


你知道我做错了什么吗?我该怎么处理吗?

就像异常所暗示的那样,你试图将字符串转换为int,这是无效的。相反,您应该称之为:

competitionFormat = int.Parse(cbCompetitionFormat.SelectedValue);
试试这个

competitionFormat = Convert.ToInt32(cbCompetitionFormat.SelectedValue);
更新:

winforms中SelectedValue的行为是返回一个表示基础绑定数据的
System.Data.DataRowView
对象。这显然不能转换为整数。您可以将此对象强制转换为最初绑定到组合框的对象类型

competitionFormat = ((Competition) cbCompetitionFormat.SelectedValue).CompetitionFormatId;

您必须检查它是否为整数

int competitionFormat;
bool result = Int32.TryParse(cbCompetitionFormat.SelectedValue, out competitionFormat);

if (result) { }
问题在于:

private void cbCompetitionFormat_SelectedIndexChanged(object sender, EventArgs e)
{
    int competitionFormat = 1;
    competitionFormat = (int)cbCompetitionFormat.SelectedValue; // <- This is an invalid cast
}

我终于得到了这个问题的答案,并且在这个网站上回答了另一个类似的问题。在这里找到答案:

答案是:
如果您只想在用户更改组合框中的选定项目时做出反应,那么最好订阅SelectionChangeCommitted,而不是SelectedIndex(或Value)Changed。

更改
(int)cbCompetitionFormat。SelectedValue
更改为
(int)cbCompetitionFormat.SelectedIndex
?调试它并查看cbCompetitionFormat.SelectedValue的类型是什么。
CompetitionFormatId
是数字还是数字列表?
CompetitionFormatId
的数据类型是什么
Int32
?从SelectedValue更改为SelectedIndexed并向值中添加一个值对我有效,但这只是因为我的Id恰好从1运行到4。不过,感谢mikeTheLiar。此解决方案给了我以下错误:无法将类型为“System.Data.DataRowView”的对象强制转换为类型为“System.IConvertible”。此解决方案正在生成,但出现以下运行时错误。(我喜欢你的想法。)无法将“System.Data.DataRowView”类型的对象强制转换为“GolfScoringSystems.RealTimeSolutions.Model.Competition”。请尝试
competitionFormat=((Competition)cbCompetitionFormat.SelectedItem)。CompetitionFormatId
Nah,仍然会得到相同的运行时错误。肯定有一种方法可以访问对象中的细节?感谢您的帮助。此解决方案无法生成,出现以下错误:错误1参数1:无法从“object”转换为“string”,错误2“int.Parse(string)”的最佳重载方法匹配'有一些无效参数此解决方案无法生成,出现以下错误:错误2“int.TryParse(string,out int)”的最佳重载方法匹配”有一些无效参数错误3参数1:无法从'object'转换为'string',您还转换到哪里?我不明白您的问题?
competitionFormat = cbCompetitionFormat.SelectedValue;