3

InvalidCastException次のコードで実行時に「 」が表示されます。

私のC#WinFormコードには、データベースから次のコードが入力されたコンボボックスが含まれています。

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

()は数字のリストであり、(ValueMember)はテキストのリストです。実行時にこのコンボボックスの項目を変更すると、エラー「」が発生します。CompetitionFormatIdDisplayMemberCompetitionFormatTypestringInvalidCastException

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

私が間違っていることと、それを回避する方法についてのアイデアはありますか?

4

5 に答える 5

2

整数かどうかを確認する必要があります。

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

if (result) { }
于 2013-01-14T21:36:41.840 に答える
1

例外が示すように、文字列をintにキャストしようとしていますが、これは無効です。代わりに、次のように呼び出す必要があります。

competitionFormat = int.Parse(cbCompetitionFormat.SelectedValue);
于 2013-01-14T21:34:14.837 に答える
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;
于 2013-01-15T00:07:37.550 に答える
1

私はついにこれに対する答えを得ました、そしてそれはこのサイトで別の同様の質問に答えられました。ここで答えを見つけてください:フォームがロードされたときにcomboBoxのselectedIndexChangedイベントが発生しないようにします

答えは次のとおりです。ユーザーがコンボボックスで選択した項目を変更したときにのみ反応する場合は、SelectedIndex(またはValue)ChangedではなくSelectionChangeCommittedにサブスクライブすることをお勧めします。

于 2013-01-21T23:25:42.950 に答える
0

これを試して

competitionFormat = Convert.ToInt32(cbCompetitionFormat.SelectedValue);

アップデート:

winformsでのSelectedValueの動作はSystem.Data.DataRowView、基になるバインドされたデータを表すオブジェクトを返すことです。これは、明らかに整数に変換できません。このオブジェクトは、元々コンボボックスにバインドされていたタイプのオブジェクトにキャストできます。

competitionFormat = ((Competition) cbCompetitionFormat.SelectedValue).CompetitionFormatId;
于 2013-01-14T21:34:45.817 に答える