[英]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";
}
ValueMember
( CompetitionFormatId
)是一个数字列表, DisplayMember
( CompetitionFormatType
)是一个文本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.