空引用异常

3

在C#的Win-forms中,我向我的表单添加了一个组合框控件,并相应地将项目添加到组合框中。我正在尝试将所选索引项分配给一个字符串,该字符串作为参数传递给以下方式声明的函数:

private void cmbPayment_SelectedIndexChanged(object sender, EventArgs e)
    {
        string pm = cmbLocation.SelectedItem.ToString();
        payment(pm);
    }

这个功能:

public void payment(string pym)
    {
        jd.PaymentMode = pym;

    }

alt文本 http://img42.imageshack.us/img42/8691/adssd.png

5个回答

7
我觉得“cmbLocation”应该改为“cmbPayment”,你觉得呢?

2

看起来cmbLocation没有选择任何项。如果没有选择项,SelectedItem属性将为null,并且您无法在null上调用toString。

您是指cmbLocation还是cmbPayment?因为这发生在一个cmbPayment事件中。

一种解决方案是检查是否为null:

private void cmbPayment_SelectedIndexChanged(object sender, EventArgs e)
{
    if(!cmbPayment.SelectedItem == null)
    {
        string pm = cmbLocation.SelectedItem.ToString();
        payment(pm);
    }
}

这是一个很好的实践,可以防止NullPointerExceptions。

我喜欢使用!= null。对我来说更易读。不过这只是个人偏好。 - Tim Scarborough

1

这通常发生在没有选择任何内容时。

然而,正如其他人所建议的那样,看起来你正在引用错误的组合框,因此即使 cmdPayment 可能有一个已选项目,你也没在引用它。你写的是 cmbLocation。


0
您正在调用 cmbLocation 的 SelectedItem 属性上的 ToString() 方法。 如果 SelectedItem 为 null/Nothing(或 cmbLocation 为 null/Nothing),则会导致 NullReferenceException 异常。

0

正如其他人所建议的那样,看起来你正在查看错误的控件上的SelectedItem

值得思考的是,你可以考虑如何解决这个问题: 在调试时,你应该能够看到什么是null,大概是SelectedItem? 还值得注意的是,你可以查看引发事件的控件sender对象。 在调试器中,你可以查看和比较选择,看到cmbLocationsender进行比较可能会引发你的认识。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接