C# 将默认项与IEnumerable
这是我从存储过程中获取用户列表的格式C# 将默认项与IEnumerable,c#,combobox,C#,Combobox,这是我从存储过程中获取用户列表的格式 IEnumerable<User> users = new List<User>(); 但是新用户似乎没有出现在我的下拉列表中。这里的问题是什么?有人能提出一个解决方法吗?提前感谢。在下拉列表中添加项目之前,请先输入您的代码,然后设置数据源 当您进行数据源分配时,会压碎旧数据 添加用户在为设置数据源之前列出新项 从下拉列表中选择用户 或 设置selectuser_下拉列表数据源,然后添加 下拉菜单新建项目选择用户\ u dropdo
IEnumerable<User> users = new List<User>();
但是新用户似乎没有出现在我的下拉列表中。这里的问题是什么?有人能提出一个解决方法吗?提前感谢。在下拉列表中添加项目之前,请先输入您的代码,然后设置数据源 当您进行数据源分配时,会压碎旧数据 添加用户在为设置数据源之前列出新项 从下拉列表中选择用户 或 设置selectuser_下拉列表数据源,然后添加 下拉菜单新建项目选择用户\ u dropdown.Items.Insert0,+新建用户
尝试之后,我发现在将组合框绑定到数据源后,无法将其添加到组合框中。要从具有绑定数据源的组合框中添加项,必须通过数据源本身进行添加。您可以使用Datatable,然后将新行添加到其中
private void BindDropdownList(IEnumerable<User> users)
{
DataTable dt = users.ToDataTable();
selectuser_dropdown.DataSource = dt ;
selectuser_dropdown.DisplayMember = "FullName";
selectuser_dropdown.ValueMember = "Id";
DataRow dr = dt.NewRow();
dr["FullName"] = "Select";
dr["Id"] = 0;
dt.Rows.InsertAt(dr, 0);
}
不要严格评判我,我认为在这里使用装饰图案会很优雅。您可以将默认用户列表包装到UserListDecorator中,从而在列表的开头或结尾添加新元素
public class UserListDecorator : IEnumerable<User>
{
private IEnumerable<User> users;
public UserListDecorator(IEnumerable<User> users)
{
this.users = users;
}
public IEnumerator<User> GetEnumerator()
{
var innerList = users.ToList();
innerList.Add(new User() {LastName = "New User", Id = 0});
return innerList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
您可以获得两个列表,一个是基本列表,另一个是带有新用户选项的列表
IEnumerable<User> users = new List<User>()
{
new User() { LastName = "One" },
new User() { LastName = "Two" }
};
var withNewUser = new UserListDecorator(users);
selectuser_dropdown.DataSource = withNewUser;
好的,那么应该怎么做才能将这个项目添加到组合框中呢?两者都不能。1.users.ToList.Addnew User{,..,..};这是一种IEnumerable类型。2.选择User_dropdown.Items.Insert0,+New User;:System.ArgumentException:“设置DataSource属性时无法修改Items集合。”执行此操作会引发错误:System.ArgumentException:“设置DataSource属性时无法修改Items集合。”selectuser_dropdown.DataBind;第行显示combobox不包含该定义。您必须将该项添加到数据源,而不是combobox。当然,只要它是可数的,你就不能这么做。将参数类型更改为IList或在此方法的调用方中添加项。
private void BindDropdownList(IEnumerable<User> users)
{
DataTable dt = users.ToDataTable();
selectuser_dropdown.DataSource = dt ;
selectuser_dropdown.DisplayMember = "FullName";
selectuser_dropdown.ValueMember = "Id";
DataRow dr = dt.NewRow();
dr["FullName"] = "Select";
dr["Id"] = 0;
dt.Rows.InsertAt(dr, 0);
}
public class UserListDecorator : IEnumerable<User>
{
private IEnumerable<User> users;
public UserListDecorator(IEnumerable<User> users)
{
this.users = users;
}
public IEnumerator<User> GetEnumerator()
{
var innerList = users.ToList();
innerList.Add(new User() {LastName = "New User", Id = 0});
return innerList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
IEnumerable<User> users = new List<User>()
{
new User() { LastName = "One" },
new User() { LastName = "Two" }
};
var withNewUser = new UserListDecorator(users);
selectuser_dropdown.DataSource = withNewUser;