【问题标题】:Type error adding list<T> to listbox in Windows Forms在 Windows 窗体中将 list<T> 添加到列表框的类型错误
【发布时间】:2021-10-30 12:07:30
【问题描述】:

初始化类人员列表

List<Staff> sList = new List<Staff>();

这是有错误的函数。该功能将被添加到按钮功能中,以显示更新的数据,例如在编辑或制作新员工后,它会自动更新列表框。

public void Reload()
    {
        lboxStaff.Items.Clear();
        lboxStaff.Items.AddRange(sList.ToArray());
    }

该错误特别突出了“sList.ToArray()”部分。错误内容为“论点 1:无法从 'Assignment_1.Staff[]' 转换为 'System.Windows.Form.ListViewItem[]'

我以前做过这种事情,隐约记得必须使用 .ToArray() 函数,但这似乎不起作用。我也尝试过使用 .ToList() 并仅使用 sList 没有任何功能,但这些都不起作用。

不确定这是否相关,但该类是部分公开的。

【问题讨论】:

  • A ListViewItem 它是 ListView 控件使用的 Type,而不是 ListBox。您不能使用AddRange() 添加自定义对象数组,您需要构建一个ListViewItem[] 数组。或者使用 ListBox 并将您的 List&lt;Staff&gt; 设置为 DataSource;还指定一个 DisplayMember 和 ValueMember 属性。
  • 谢谢你,吉米。您的评论让我意识到我不小心使用了 ListView 而不是 Listbox。
  • 如果你想更新你的ListBox,你可能更喜欢BindingList&lt;Staff&gt;,或者使用BindingSource并将List&lt;Staff&gt;设置为其DataSource,然后将BindingSource设置为ListBox的DataSource。然后让你的Staff 类实现INotifyPropertyChanged。之后,如果您将新的Staff 对象添加到列表中或更改Staff 实例的属性值,则 LIstBox 将立即反映更改。不需要lboxStaff.Items.Clear();之类的东西

标签: c# winforms listview listbox visual-studio-2019


【解决方案1】:

如上所述,您可以使用ListControl.DataSource 属性将列表添加到列表框。

这是一个代码示例,您可以参考。

public void Reload()
        {
            List<Staff> sList = new List<Staff>();

            sList.Add(new Staff() { Name = "A", Age = 11 });
            sList.Add(new Staff() { Name = "B", Age = 12 });
            listBox1.DataSource = slist;
            listBox1.DisplayMember = "Name";
            listBox1.ValueMember = "Age";
        }
    }
    public class Staff 
    {
        public string Name { get; set; }
        public int Age { get; set; }

    }

或者在 ListBox 中添加项目。

 public void Reload()
        {
            List<Staff> sList = new List<Staff>();

            sList.Add(new Staff() { Name = "A", Age = 11 });
            sList.Add(new Staff() { Name = "B", Age = 12 });
             for (int i = 0; i < sList.Count; i++)
            {
                listBox1.Items.Add(sList.ElementAt(i));
            
            }
            listBox1.DisplayMember = "Name";
            listBox1.ValueMember = "Age";
        }
 

【讨论】:

  • 好奇你为什么在第二个例子中没有使用 foreach ..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多