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;