ReorderList绑定到数据表;保存更改

分享于 

7分钟阅读

Web开发

  繁體 雙語

介绍

ReorderListASP.NET AJAX控件工具箱中的一个很酷的控件。 本文将介绍如何将控件子类化为一个基本的大纲,以便将它绑定到 DataTable,在 Reorder 事件上,将新的顺序保存到数据库中。 本文没有下载的源代码,只有在。 本文的重点是 ReorderList,而不是从数据库中保存和检索数据。

问题

ReorderList 期望它是 DataSource,它是实现 IList的对象。 我的业务对象主要使用 DataSetsDataTables,并且我想绑定到 DataTable。 控件将从 DataTable 加载数据,但在 Reorder 事件上加载异常,声明 DataTable 不实现 IList。 我试过使用 ((IListSource)DataTable).GetList() 但这一点也没有。

解决办法是什么呢

首先,创建 ReorderList的子类并重写 DoReorder 方法,如下所示:

using System;using System.Data;using AjaxControlToolkit;namespace My.Web.UI.Controls
{
 publicclass myReorderList : ReorderList
 {
 protectedoverridebool DoReorder(int oldIndex, int newIndex)
 {
 if (DataSource is DataTable)
 {
 DataRowCollection rows = ((DataTable)DataSource).Rows;
 int NewListOrder = (int)rows[newIndex][SortOrderField];
 if (oldIndex < newIndex) //item moved down {
 for (int i = oldIndex + 1; i <= newIndex; i++)
 {
 rows[i][SortOrderField] = 
 (int)rows[i][SortOrderField] - 1;
 }
 }
 else//item moved up {
 for (int i = oldIndex - 1; i >= newIndex; i--)
 {
 rows[i][SortOrderField] = 
 (int)rows[i][SortOrderField] + 1;
 }
 }
 rows[oldIndex][SortOrderField] = NewListOrder;
 returntrue;
 }
 else {
 thrownew InvalidOperationException
 ("DataSource is not a System.Data.DataTable.");
 }
 returnfalse;
 }
 }
}

下面是一些示例代码的aspx页面几乎是一模一样的代码中发现 ReorderList.aspx 样本项目的ASP.NET ajax控件工具包。 唯一的例外是 OnItemReorder="ReorderList1_ItemReorder" 也请注意 SortOrderField="Priority"。这表明数据源 DataTable 中的列的名称存储了组中项的顺序。 这里属性在子类( 上可见) 中重写的DoReorder 方法中使用,以存储新的顺序。 子类控件要求该列为 int 列。

<MyAjaxToolkit:myReorderListID="ReorderList1"runat="server"PostBackOnReorder="false"CallbackCssStyle="callbackStyle"DragHandleAlignment="Left"ItemInsertLocation="End"DataKeyField="ItemID"SortOrderField="Priority"OnItemReorder="ReorderList1_ItemReorder"><ItemTemplate><divclass="itemArea"><asp:LabelID="Label1"runat="server"Text='<%# HttpUtility.HtmlEncode(Convert.ToString(Eval("Title"))) %>'/><asp:LabelID="Label2"runat="server"Text='<%# HttpUtility.HtmlEncode(Convert.ToString(Eval("Description", " - {0}"))) %>'/></div></ItemTemplate><EditItemTemplate><divclass="itemArea"><asp:TextBoxID="TextBox2"runat="server"Text='<%# Bind("Title") %>'/><asp:TextBoxID="TextBox3"runat="server"Text='<%# Bind("Description") %>'/><asp:TextBoxID="TextBox4"runat="server"Text='<%# Bind("Priority") %>'/></div></EditItemTemplate><ReorderTemplate><asp:PanelID="Panel2"runat="server"CssClass="reorderCue"/></ReorderTemplate><DragHandleTemplate><divclass="dragHandle"></div></DragHandleTemplate><InsertItemTemplate><!--<span class="code-comment"> bottom border is workaround for IE7 Beta issue where bg doesn't render --></span><divstyle="padding-left:25px; border-bottom:thin solid transparent;"><asp:PanelID="panel1"runat="server"DefaultButton="Button1"><asp:TextBoxID="TextBox1"runat="server"Text='<%# Bind("Title") %>'/><asp:ButtonID="Button1"runat="server"CommandName="Insert"Text="Add"/><asp:RequiredFieldValidatorID="RequiredFieldValidator1"runat="server"ErrorMessage="Please enter some text"ControlToValidate="TextBox1"/></asp:Panel></div></InsertItemTemplate></MyAjaxToolkit:myReorderList>

然后在aspx页后面的代码中,我们需要这样的内容:

protectedvoid Page_Load(object sender, EventArgs e)
{
 ReorderList1.ItemDataBound += 
 new EventHandler<AjaxControlToolkit.ReorderListItemEventArgs>
 (ReorderList1_ItemDataBound);
 if (!IsPostBack)
 {
 BindReorderList();
 }
 else {
 // Need code here to retrieve the data source DataTable from// the Session object or other persistence method and assign it to// ReorderList1.DataSource property }
}void BindReorderList()
{
 // Need code here to fill SomeDataTable with a DataTable.// It must contain an int column named in the SortOrderField// property of the myReorderList control markup in the aspx page ReorderList1.DataSource = SomeDataTable;
 ReorderList1.DataBind();
 //Need to save SomeDataTable to the Session object or //other persistence method}protectedvoid ReorderList1_ItemReorder(object sender, 
 AjaxControlToolkit.ReorderListItemReorderEventArgs e)
{
 // need code to save changes made to the data source DataTable// The changes were made in the overridden DoReorder method// in the MyReorderList control BindReorderList();
}

相关文章