在 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<Staff>
设置为 DataSource;还指定一个 DisplayMember 和 ValueMember 属性。
谢谢你,吉米。您的评论让我意识到我不小心使用了 ListView 而不是 Listbox。
如果你想更新你的ListBox,你可能更喜欢BindingList<Staff>
,或者使用BindingSource并将List<Staff>
设置为其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>?