在ASP.NET Repeater中添加多个新行

5
我正在开发一个允许用户输入/编辑多条记录的asp.net页面。我使用了一个Repeater控件来显示每个记录的输入字段。我想要添加一个“添加”按钮,当点击该按钮时,可以插入一组新的空白记录输入字段。用户应该能够输入新记录,然后多次单击添加按钮继续添加新记录。然后,当用户单击保存按钮时,这些新记录将与现有记录的更改一起保存。如果用户没有点击保存,则应丢弃记录并不写入数据库中。
是否有办法在Repeater控件中实现此“添加”功能呢?

从经验来看,这并不是一个容易实现的任务,主要是因为事件循环...你真的希望动态控件作为初始化的一部分被添加进去,但那是在按钮的点击事件之前很久的事情了。虽然不容易,但还是可以做到的。 - freefaller
1个回答

1

这个问题有一个相当简单的解决方案。假设您有某种视图模型来暂时保存用户输入的数据,您可以在重复器使用作为数据源的集合中添加一个额外的“空白”视图模型。在保存时,您可以简单地将所有存在于您的视图模型中的修改保存到数据库中。一个可能的例子是:

    protected void btnAdd_OnCommand(object sender, EventArgs e)
    {
        List<Item> items = (List<Item>)this.ItemRepeater.DataSource;
        items.Add(new Item() { Id = -1 });
        this.ItemRepeater.DataBind();
    }

    protected void btnSave_OnCommand(object sender, EventArgs e)
    {
        List<Item> items = (List<Item>)this.ItemRepeater.DataSource;

        foreach (Item itm in items)
        {
            if (itm.Id == -1)
            {
                //Save New Item
            }
            else
            {
                //Update existing item
            }
        }
    }

这里的主要注意点是,您必须使用视图模型更新重新填充ItemRepeater的数据源,以便保留/显示用户所做的任何更改。


.DataBind会丢失现有的值。您可以使用我的“每次往返添加一行”解决方案,并且只在单击此类按钮时才真正保存。这就是我现有的使用此功能的实现方式。 - Mark Hurd
@MarkHurd 我觉得你误读了我的例子。如果你注意到,我假设用户已经适当地填充了DataSource。然后我检索数据源,修改它,并重新绑定数据。这将导致附加项与原始项一起DataBound。这里唯一需要实现的技巧是在postbacks之间将作为DataSource的对象存储在有状态的存储中。 - Jaime Torres
你能确认一下是否有一种方法可以进行DataBind而不会丢失现有的实时更改吗?或者你是在说“始终存储实时更改,以便DataBind重新绑定当前值”? - Mark Hurd
你必须保持视图模型的状态与视图的状态同步。在我的提供的方法中,我不确定没有一个好的理由不这样做。 - Jaime Torres
是的,我想这只是一种不同的方法。如果您在PostBack时不使用.DataBind,则会为您保留“实时”的设置。 - Mark Hurd
我编辑了答案,以便(希望)从我的回答中消除任何歧义。 - Jaime Torres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接