0

我有一个包含两个项目的组合框。I also have a button that opens a new form when one of these items are selected. 但是,如果没有选择任何项目,则会出现异常(空指针)。我已尝试(无济于事)捕获此异常并显示一个提示用户选择其中一项的 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();

您不能确定该值不为空,因此您应该在调用 .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 回答