我在运行时在以下代码中收到“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;
}
任何想法我做错了什么以及如何绕过它?
答案 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;