0

私はここですべてのアイデアがありません

問題は、2 つのコンボボックスを使用していて、両方のコンボボックスから値を取得して、wpf の DataGrid にコンテンツを表示したいということです。

両方のコンボボックスから値を取得するこの関数があります。これはうまくいきます。

private void cboxYearChange(object sender, SelectionChangedEventArgs e)
    {
        ComboBoxItem typeItemYear = (ComboBoxItem)comboBox2.SelectedItem;
        string valueYear = typeItemYear.Content.ToString();

        ComboBoxItem typeItemMonth = (ComboBoxItem)comboBox1.SelectedItem;
        string valueMonth = typeItemMonth.Content.ToString();
}

しかし、他のコンボボックスの変更をチェックする別の関数を作成したいと思います:

private void cboxMonthChange(object sender, SelectionChangedEventArgs e)
    {
        ComboBoxItem typeItemYear = (ComboBoxItem)comboBox2.SelectedItem;
        string valueYear = typeItemYear.Content.ToString();

        ComboBoxItem typeItemMonth = (ComboBoxItem)comboBox1.SelectedItem;
        string valueMonth = typeItemMonth.Content.ToString();

} 

ビルドはできますが、これを実行すると、ComboBoxItem typeItemYear = (ComboBoxItem)comboBox2.SelectedItem; で Object reference not set to an instance エラーが発生します。cboxMonthChange 関数の行

ここで何が欠けていますか?

4

2 に答える 2

0

SelectedItem は、何かが選択されるまで null です。両方が同時に変更されない限り (これらのイベントは順番に発生するため、これは不可能です)、comboBox1.SelectedItem またはomboBox2.SelectedItem の型キャストのいずれかが例外をスローします。

SelectedItem がメソッドに設定されているかどうかを確認します。または、次のような別のキャストを使用します。

ComboBoxItem item1 = ComboBox1.SelectedItem as ComboBoxItem; if (item1 != null) { // 何かをする }

お役に立てれば :-)

于 2013-01-01T21:50:47.520 に答える
0

1) 可能な限り、コード内でコントロールの名前を参照しないでください。
たとえば、 を にキャストすることで、SelectionChanged ハンドラー内でどの ComboBox が変更されたかを知ることができSenderますComboBox
2) しかし、このような単純なケースでは、パブリック プロパティを使用してそれらを ComboBox にバインドするだけです。すべてコードなしで完了します。

<ComboBox x:Name="YearSelectCB" SelectedItem="{Binding SelectedYear}">
<ComboBox x:Name="MonthSelectCB" SelectedItem="{Binding SelectedMonth}">

(ウィンドウの DataContext は、いくつかの方法で設定できます。たとえば、ウィンドウ ロード イベント ハンドラー (DataContext=this) など)。

于 2013-01-01T21:56:53.547 に答える