在winform应用程序中从Combobox读取值

4
我是一名帮助翻译的助手。
我正在使用VS2010构建一个Windows表单应用程序。我想要读取用户从下拉ComboBox中选择的值,并基于此生成patientNo。但是当我运行应用程序时,我收到了NullReferenceException
以下是我的代码:
private void button1_Click(object sender, EventArgs e)
{
    string patientNumber;

    string gender = comboBox2.SelectedValue.ToString();
    if (gender != null)
    {
        if (gender == "Female")
        {
            var generator = new PatientNumberGenerator();
            patientNumber = generator.GeneratePatientNumber(Gender.Female);
            const string message = "patientNumber";

            const string caption = "Testing PatientNumber class";
            var result = MessageBox.Show(message, caption,
                                         MessageBoxButtons.YesNo,
                                         MessageBoxIcon.Question);

        }
        else if (gender == "Male")
        {
            var generator = new PatientNumberGenerator();
            patientNumber = generator.GeneratePatientNumber(Gender.Male);
            const string message = "patientNumber";

            const string caption = "Testing PatientNumber class";
            var result = MessageBox.Show(message, caption,
                                         MessageBoxButtons.YesNo,
                                         MessageBoxIcon.Question);
        }
   }

}


3
我怀疑你所提出的八个问题都没有正确答案。你需要接受其中一些问题没有确切答案。 - Ash Burlaczenko
3
我有一些想法,可以找出错误可能发生的地方,但如果您告诉我们在哪一行代码出现异常,将会更有帮助。此外,如果您不打算接受我的答案,就像之前您对其他问题回答一样不接受,那我也不会回答这个问题。 - aKzenT
你是如何初始化combobox的? comboBox2.SelectedValue 可能为空。 - Raj Ranjhan
哪一行抛出了异常? 您尝试使用断点来检查组合框选择的值了吗? 而且您从不接受任何答案,这对您在该网站上并没有帮助。 - phadaphunk
请在工作完成后通知我,我会接受。 - kombo
5个回答

9

您没有说明异常发生在哪一行,所以这有些难以确定。不过:

string gender = comboBox2.SelectedValue.ToString();

comboBox2.SelectedValue 可能为 null,在这种情况下,试图调用 ToString() 将导致 NullReferenceException。请尝试以下代码:

if (comboBox2.SelectedValue == null)
{
    return;
}
string gender = comboBox2.SelectedValue.ToString();
//[etc…]

如果这不是你遇到的问题,异常可能在该方法中的其他调用中,比如 GeneratePatientNumber

1
在你的例子中,如果它到达 ToString 行,SelectedValue 将始终为 null。 - Ash Burlaczenko
修正后,异常已经消失,但是在消息框上没有显示任何内容。 - kombo
然后,您需要找出为什么SelectedValue始终为空,这很难从发布的代码中找出。也许这些 SO 问题之一能帮助到您。 - raveturned

3
如果你在代码中设置了comboBox2.DataSource属性为某些数据源,那么.SelectedValue将会检索到一个值。如果你没有设置.DataSource属性,则SelectedValue会返回null。
我猜测你一直得到null值是因为你没有设置数据源,而是在VS设计器中设置了项目。如果是这种情况,你应该使用以下方式:
comboBox2.SelectedItem.ToString()

获取列表中的SelectedItem。


您不必使用数据源才能使用SelectedItem。 - Ash Burlaczenko
@AshBurlaczenko,但如果您不使用数据源(正如我怀疑OP正在这样做),那么您必须使用SelectedItem。 - Brad Rem
谢谢BradRem,你真的解释了我的问题的原因。 - kombo

2
不要在case中使用combobox1.SelectedValue,请改为:
string selected = combobox1.SelectedItem.ToString();

对我来说有效。


0

除了在GeneratePatientNumber中,我唯一能想到你会遇到NullReferenceException的地方是

comboBox2.SelectedValue.ToString();

如果没有选择任何内容,.SelectedValue 将为 null,因此无法调用 ToString()

@ecomma,.Text 已经返回一个字符串了,所以不需要使用 .ToString() - Ash Burlaczenko

0

我知道这已经过去一年了,但我正在处理一个类似的项目,遇到了完全相同的错误。对我有用的解决方法是使用

comboBox2.SelectedText.ToString();

或者

comboBox2.SelectedItem.ToString();

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