繁体   English   中英

如何解决“InvalidCastException”?

[英]How do I solve an “InvalidCastException”?

我在运行时在以下代码中收到“ InvalidCastException ”:

我的C#WinForm代码包含一个comboBox,它使用以下代码从数据库中填充:

public void PopulateCompetitionFormatDd()
{
     var _competitionFormat            = new CompetitionFormatBL();
     cbCompetitionFormat.DataSource    = _competitionFormat.GetByAllCompetitionFormats();
     cbCompetitionFormat.ValueMember   = "CompetitionFormatId";
     cbCompetitionFormat.DisplayMember = "CompetitionFormatType";
}

ValueMemberCompetitionFormatId )是一个数字列表, DisplayMemberCompetitionFormatType )是一个文本string 当我在运行时更改此组合框中的项目时,我收到错误“ InvalidCastException ”。

private void cbCompetitionFormat_SelectedIndexChanged(object sender, EventArgs e)
{
     int competitionFormat = 1;
     competitionFormat = (int)cbCompetitionFormat.SelectedValue;
}

我有什么不妥的想法以及如何解决这个问题?

你必须检查它是否是一个整数。

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

if (result) { }

就像异常暗示的那样,你试图将一个字符串转换为int,这是无效的。 相反,你应该调用类似的东西:

competitionFormat = int.Parse(cbCompetitionFormat.SelectedValue);

问题在于:

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

SelectedValue只返回 - 选定的值,而不是选定的索引。 使用属性SelectedIndex将返回您想要的(0索引),并且(我认为)您甚至不需要强制转换它:

competitionFormat = cbCompetitionFormat.SelectedValue;

我终于得到了答案,并在这个网站上回答了另一个类似的问题。 在这里找到答案: 在表单加载时停止comboBox的selectedIndexChanged事件

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

试试这个

competitionFormat = Convert.ToInt32(cbCompetitionFormat.SelectedValue);

更新:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM