在 Windows 窗体中将 list<T> 添加到列表框的类型错误

Posted

技术标签:

【中文标题】在 Windows 窗体中将 list<T> 添加到列表框的类型错误【英文标题】:Type error adding list<T> to listbox in Windows Forms 【发布时间】: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();之类的东西 【参考方案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 ..?

以上是关于在 Windows 窗体中将 list<T> 添加到列表框的类型错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 List<List<T>> 转换为 List<T>

在 WinForm 中将 List<T> 绑定到 DataGridView

如何在 C# 中将 List<DataRow> 转换为 List<T>?

如何在 C# 中将 IEnumerable<T> 转换为 List<T>?

在 C# 中将 Windows 窗体属性绑定到 ApplicationSettings 的最佳方法?

在 Windows 窗体/WPF 应用程序中将 Revit 文件渲染到图形表面