c# - ComboBox.SelectedValue 抛出空引用异常

标签 c# .net winforms

我整理了以下代码来演示我遇到的问题。

这是一个只有组合框的表单,在加载方法中使用从 LINQ 生成的数组填充组合框。

它设置了 DisplayMember 和 ValueMember。显示成员按预期工作 - 它显示数字列表。但是,如评论所述,SelectedValue 为空。

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DisplayMember = "Number";
    comboBox1.ValueMember = "Square";

    var it = from n in new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
             select new NumberAndSquare(n);
    comboBox1.Items.AddRange(it.ToArray());
}

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
    ComboBox combo = sender as ComboBox;
    MessageBox.Show(combo.SelectedItem.ToString());  //works as expected
    MessageBox.Show(combo.SelectedValue.ToString()); //throws null reference exception
}

class NumberAndSquare
{
    public NumberAndSquare(int number)
    {
        Number = number;
    }

    public int Number
    { get; set; }
    public int Square
    {
        get
        {
            return Number*Number;
        }
    }

    public override String ToString()
    {
        return string.Format("{0}: {1}", Number, Square);
    }
}

我做错了什么?

最佳答案

SelectedValue 在这种情况下无疑是 null,因为没有任何内容绑定(bind)到它。据我所知,DataMember/ValueMember 属性仅在您将 DataSource 绑定(bind)到您的组合框(您不是)时使用。例如,如果您将代码更改为:

var it = from n in new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
         select new NumberAndSquare(n);
comboBox1.DataSource = it.ToList();
comboBox1.DisplayMember = "Number";
comboBox1.ValueMember = "Square";

它应该工作

关于c# - ComboBox.SelectedValue 抛出空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14379183/

相关文章:

c# - 使用 C# ClearCase checkin 和 checkout

c# - 如何在C#中检查是否安装了windows服务

c# - 3 层架构 - 将 sql 查询放在业务层是否可以

c# - 远程桌面 "can' t 连接到远程计算机”

c# - 将父鼠标事件应用到子元素

.net - 在 Windows 窗体面板中查找控件

c# - 用于像 Wireshark Diagnostics 这样的窗口的 XAML?

c# - Wpf - 接收框架元素属性的属性值更改通知

.net - 如何向 System.Windows.Forms.MenuItem 添加图标?

.net - Winforms 样式/UI 外观和感觉提示