我有两个项目的组合框。我还有一个按钮,当选择其中一个项目时,它会打开一个新表格。但是,如果没有选择任何项目,则会出现异常(nullpointer)。我已经尝试(无济于事)捕获此异常并显示一个提示用户选择其中一个项目的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();
}
}
答案 0 :(得分:2)
在非特殊情况下,您不应该使用流控制异常。用户没有选择任何东西的情况肯定不是特例。
正确的方法是进行简单的null
检查:
if(cbTable.SelectedItem == null)
{
// Show message box
}
else
{
// Your current code
}
为什么你的异常处理代码不起作用是不可能回答的,因为你没有在你的问题中包含它。
答案 1 :(得分:0)
我认为问题在于:
ss = dtGrid1.CurrentCell.Value.ToString();
您无法确定该值是否为null,因此您应在调用.ToString()之前检查它。
您可以使用RequiredValidator执行javascript验证,而不是使用消息框,从而避免无用的回发。
答案 2 :(得分: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.");
}