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