0

私は2つのアイテムを持つコンボボックスを持っています。これらの項目のいずれかが選択されたときに新しいフォームを開くボタンもあります。ただし、どの項目も選択されていない場合は、例外 (nullpointer) が発生します。この例外をキャッチして、ユーザーに項目の 1 つを選択するように求める mbox を表示しようとしましたが (役に立ちませんでした)。

ボタンクリックイベントのコードは次のとおりです。

if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
        {
            string name;
            string ss;
            foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
            {
                ss = dtGrid1.CurrentCell.Value.ToString();
                name = dtGrid1.SelectedCells[1].Value.ToString();
                BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                bmw.Label2.Text = ss;
                bmw.Label1.Text = name;
                bmw.ShowDialog();
            }
        }
4

3 に答える 3

2

例外的ではない場合、フロー制御に例外を使用することは想定されていません。ユーザーが何も選択しなかった場合も例外ではありません。

正しいアプローチは、単純なnullチェックです。

if(cbTable.SelectedItem == null)
{
    // Show message box
}
else
{
    // Your current code
}

例外処理コードが機能しない理由は、質問に含めていないため、答えることができません。

于 2013-02-18T11:26:06.407 に答える
0

問題は次の行にあると思います。

ss = dtGrid1.CurrentCell.Value.ToString();

値が null でないことを確認できないため、.ToString() を呼び出す前に確認する必要があります。

メッセージ ボックスを使用する代わりに、RequiredValidator を使用して JavaScript 検証を実行し、無駄なポストバックを回避できます。

于 2013-02-18T11:26:54.317 に答える
0

パフォーマンスと読みやすさの観点から、このように例外をキャッチするのではなく、コンボ ボックスで選択された値をチェックすることをお勧めします。

if(cbTable.SelectedItem == null)
{
         MessageBox.Show("Please select a value in the combo box.");
         return;
}

if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
        {
            string name;
            string ss;
            foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
            {
                ss = dtGrid1.CurrentCell.Value.ToString();
                name = dtGrid1.SelectedCells[1].Value.ToString();
                BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                bmw.Label2.Text = ss;
                bmw.Label1.Text = name;
                bmw.ShowDialog();
            }
        }

ただし、特定のクエリに答えるには、次のようにNullReferenceExceptionをキャッチできます。

 try{
        if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
        {
            string name;
            string ss;
            foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
            {
                ss = dtGrid1.CurrentCell.Value.ToString();
                name = dtGrid1.SelectedCells[1].Value.ToString();
                BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                bmw.Label2.Text = ss;
                bmw.Label1.Text = name;
                bmw.ShowDialog();
            }
        }
    }
    catch(NullReferenceException ex)
    {
         MessageBox.Show("Please select a value in the combo box.");
    }
于 2013-02-18T11:33:10.997 に答える