如何解决“InvalidCastException”?

时间:2013-01-14 21:31:12

标签: c# winforms casting

我在运行时在以下代码中收到“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;
}

任何想法我做错了什么以及如何绕过它?

5 个答案:

答案 0 :(得分:2)

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

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

if (result) { }

答案 1 :(得分:1)

与异常暗示一样,您正在尝试将字符串转换为int,这是无效的。相反,你应该打电话给:

competitionFormat = int.Parse(cbCompetitionFormat.SelectedValue);

答案 2 :(得分:1)

问题在于:

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;

答案 3 :(得分:1)

我终于得到了答案,并在这个网站上回答了另一个类似的问题。在这里找到答案:Stop comboBox's selectedIndexChanged event from firing when the form loads

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

答案 4 :(得分:0)

试试这个

competitionFormat = Convert.ToInt32(cbCompetitionFormat.SelectedValue);

<强>更新

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

的对象类型
competitionFormat = ((Competition) cbCompetitionFormat.SelectedValue).CompetitionFormatId;