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;