返回首页

介绍
最近,有人问如何使用ASP.NET Repeater控件增加新的项目的数据源,它必将​​在论坛。由于话语有时不传达足够的认识,我把这个范例显示如何在这种情况下,可以使用Repeater控件一起就地编辑。
此示例包含两个版本,一个服务器端导向的方法,和一个客户端导向的方法,使用AJAX。中继器与GridView的
当提供就地编辑和添加行,想到的第一件事通常是使用ASP.NET GridView控件。这篇文章是不是两个控件之间也不时/如何选择一个比其他的差异,但在快看差异显示了这一点:GridView的直放站默认情况下,表布局使用模板已选择/修改/删除命令必须手动添加内置寻呼机支持必须手动添加 列排序必须手动添加
虽然不是一个详尽的清单,它仿佛在GridView拥有明显的优势,通过提供更多内置功能。然而,所有这些功能是有代价的。 GridView是一个非常quot; heavyquot;控制上广泛使用的ViewState来正常工作,并在某些情况下增加了太多的开销到一个页面。这是一个ASP.NET Repeater控件时可以有优势。服务器端方法
在这第一种方法,我会依靠传统的编码使用回传和数据绑定事件提供功能服务器端。我包裹在Repeater控件和ASP.NET的UpdatePanel,减少页面刷新,但在其他方面也有只是一个客户端的代码涉及的几行。

<asp:UpdatePanel runat="server">

    <ContentTemplate>

        <asp:Repeater runat="server" ID="Repeater1" 

        OnItemCommand="OnItemCommand" OnItemDataBound="OnItemDataBound">

            <HeaderTemplate>

                <table border="0" cellpadding="0" cellspacing="0">

                    <tr>

                        <th></th>

                        <th>First Name</th>

                        <th>Last Name</th>

                    </tr>

            </HeaderTemplate>

            <ItemTemplate>

                <tr>

                    <td>

                        <asp:ImageButton ID="Edit" 

                        ImageUrl=" /Images/EditDocument.png" 

                        runat="server" CommandName="edit" />

                        <asp:ImageButton ID="Delete" 

                        ImageUrl=" /Images/Delete_black_32x32.png" runat="server"

                            CommandName="delete" />

                    </td>

                    <td>

                        <asp:Label runat="server" 

                        ID="firstName"><%# Eval

                        ("FirstName") %></asp:Label>

                        <asp:PlaceHolder runat="server" 

                        ID="firstNameEditPlaceholder" />

                        <input type="hidden" runat="

                        server" id="firstNameHidden" />

                    </td>

                    <td>

                        <asp:Label runat="server" ID="

                        lastName"><%# Eval("LastName") %></asp:Label>

                        <asp:PlaceHolder runat="server" 

                        ID="lastNameEditPlaceholder" />

                        <input type="hidden" runat="

                        server" id="lastNameHidden" />

                    </td>

                </tr>

            </ItemTemplate>

            <FooterTemplate>

                <tr>

                    <td>

                        <asp:ImageButton ID="Delete" 

                        ImageUrl=" /Images/112_Plus_Blue_32x32_72.png" runat="server"

                            OnClick="OnAddRecord" />

                    </td>

                    <td><asp:TextBox runat="server" 

                    ID="NewFirstName" /></td>

                    <td><asp:TextBox runat="server" 

                    ID="NewLastName" /></td>

                </tr>

                </table>

            </FooterTemplate>

        </asp:Repeater>

    </ContentTemplate>

</asp:UpdatePanel>    

可以看出,这是一个很小的例子,就足以证明的技术,实际使用,当然,因人而异。用于表布局简单,而且可以产生任何类型的布局,使用模板和CSS。
这里的两个关键事件OnItemCommand和的OnItemDataBound将覆盖在某一时刻。数据源
由于控制需要一个数据源绑定到,我创建了一个非常简单的实体...{C}
...与此示例中的一个非常简单的数据访问层:
public class Data

{

    public Data()

    {

    }



    public int NextId

    {

        get

        {

            int id = 0;

            if(Contacts.Count != 0)

            {

                id = Contacts.Max(c => c.ID) + 1;

            }

            return id;

        }

    }



    public List<contact /> Contacts

    {

        get

        {

            if(HttpContext.Current.Session["contacts"] == null)

            {

                HttpContext.Current.Session["contacts"] = new List<contact />();

            }

            return HttpContext.Current.Session["contacts"] as List<contact />;

        }

    }

}

当然,在生产系统中,这将更加复杂和最有可能使用数据库作为数据存储。然而,出于演示的目的,这将是足够的。服务器端事件
如果没有数据控件绑定到目前,需要有一种方法将项目添加到数据源。上面显示的标记包含一个包含控件允许用户输入的数据和一个LinkBut​​ton触发OnAddRecored的事件处理程序表行FooterTemplate中。{体C3}
没有过于复杂,在这里。该事件被触发LinkBut​​ton的,在此事件处理程序的sender对象。从这一点,你就会得到,的RepeaterItem这是LinkBut​​ton的父对象,并找到TextBox控件。然后它添加到数据源,并重新绑定Repeater控件是一个简单的问题。处理就地编辑时,它变得稍微复杂。
OnItemCommand事件处理命令的行动形成的LinkBut​​ton:{的C4}
删除操作非常简单。只是基于该指数的数据源中删除项目。编辑,我设置的ViewState的抵押财产,希望编辑的控制是数据绑定时,将用于该项目的索引EditIndex,。
虽然在TextBox控制co​​uldnbsp已在ItemTemplate中的每一行添加和使用visibility属性创建开销太大。编辑只是做一个项目在时间上有提供很多文本框,甚至以为他们是无形的,而且可能永远不会使用的是过重的方法。相反,将动态添加控件使用PlaceHolder控制正在编辑的行。{C5的}
占位符的控制是必要的动态添加TextBox控件,因为虽然你可以检索标签控制,并找到家长控制,在这种情况下,表单元格,你不能添加TextBox,因为ASP.NET生成的元素1 LiteralControl的其中添加子控件不支持。加入TextBox和分配从数据源的电流值后,Label控件隐藏设置能见度= FALSE然后HtmlHiddenInput领域的可视性设置真实的,所以他们将被渲染和可用。最后一步是删除编辑按钮和重用保存编辑完成的项目,一旦删除"按钮。为HtmlHiddenInput原因解释如下。保存编辑的项目
保存在就地编辑那里得到一个比较复杂一点,使用服务器端处理。当点击"保存"按钮,第一个事件被解雇的ItemCommand。然而,因为编辑控件动态添加在ItemDataBound事件,这一事件并没有被解雇,他们是不可用。同样,因为控制并没有被约束到任何数据,Label控件正在重组,使他们不能被用于临时存储从ViewState。在这个地方,HtmlHiddenInput控制使用JQuery的基于JavaScript的转移从编辑控件的隐藏字段的值。这是唯一的客户端在这个例子中的代码。{5233}使用AJAX的客户端
在前面的例子,A​​SP.NET引擎处理了很多的渲染和幕后处理,客户端的方法,但是,它必须由专人实施。
的第一件事开始挂接按钮事件,加载文件时。现场的jQuery方法用于编辑和删除按钮,所以任何新添加的行会自动事件农具。{C7-}
下一步是实现的功能,添加新的联系人。{C8的}
在这里,这个变量,它代表的添加按钮被点击,被用来寻找它属于表列。由此看来,输入元素被发现,是由用户输入的文本提取。现在的伎俩,在新行插入到表中。的NewRow将试图克隆一个现有的行,如果存在,否则必须创建的HTML。另一种方法是创建标记的行,但显示隐藏,然后使用克隆。
function NewRow(tr)NewRow(tr)

{

    // If only one sibling then create a new row

    // otherwise just clone an existing one

    if(tr.siblings().length != 1)

    {

        var clone = tr.prev().clone();

        tr.before(clone);

    }

    else

    {

        var newRow = "<tr id=''>" +

            "<td>" +

                "<image id='edit' src='Images/EditDocument.png' class='imgButton' />" +

                "<image id='delete' 

			src='Images/Delete_black_32x32.png' class='imgButton'/>" +

            "</td>" +

            "<td>" +

                "<span ID='firstName'></span>" +



            "</td>" +

            "<td>" +

                "<span ID='lastName'></span>" +

            "</td>" +

        "</tr>";

        tr.before(newRow);

    }



    return tr.prev();

}

已插入新行后,由用户输入的文本已更新,下一步是添加新接触到的数据存储在服务器上。这是通过一个AJAX调用页面上的WebMethod。{C10的}
有没有什么很复杂在这里,只是包的数据和发送的方法,通过AJAX。如果该方法成功完成后,新添加的联系人的ID然后分配给新添加的行的id属性,所以这将是可编辑或删除操作。编辑并保存
编辑功能来处理类似的服务器端的方法,插入输入控制inline和替换编辑和删除按钮。
储蓄是又一次类似的提取值,更新标签,恢复按钮,并在服务器上更新数据源。{C12的}结论
的例子并不意味着是一个ASP.NET Repeater控件的功能进行了广泛的探索,但希望它已经成功地证明,它可以对数据源使用CRUD操作。历史最初编辑:11年8月29日|马克Nischalke

回答

评论会员:游客 时间:2012/02/04
干得好,马克;你做了一项伟大的工作!100{S0}
osmofrilander:尼斯之一。这将是更好,如果你已经包含截图(S)。顺便说一句恭喜你太(再次MVP)的{S0的}
评论会员:seenit 时间:2012/02/04
不错,简单,明了,非常理解{BR​​}JESS
评论会员:艾哈迈德Hyari 时间:2012/02/04
文章对我来说非常helpfule
评论会员:MrBigcat 时间:2012/02/04
您好,

谢谢你的文章。我不能下载的代码。链接有任何问题吗?
领导
评论会员:游客 时间:2012/02/04
标记Nischalke:解压缩失败