WEBSWAPP Silverlight ASP.NET 3.5 ASP.NET 2.0 ASP.NET 1.0
Cascading Lists
ITemplate
DDL in GridView
G/V MultiSelect
Nested GridViews
RegExp
DataGrid Reorder
Events fire twice
Hyperlink Field
TextBox
UpdateParameters
MultiView
TreeView
Move rows Sort on Rank
    
<%@ Page Language="C#" AutoEventWireup="false" %> <%@ Import Namespace="System.Data" %> <script runat='server'> private DataTable dt; protected override void OnInit(EventArgs e) { base.OnInit(e); Page.Load += new EventHandler(Page_Load); Page.PreRender += new EventHandler(Page_PreRender); DataGrid1.ItemCommand += new DataGridCommandEventHandler(DataGrid1_ItemCommand); } void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e) { Int32 rowID = (Int32)DataGrid1.DataKeys[e.Item.ItemIndex]; Int32 rowIndex = 0; DataRow rowToBeMoved = dt.NewRow(); //create a copy of the row to be moved for (Int16 i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["ID"].Equals(rowID)) { rowIndex = i; rowToBeMoved["ID"] = dt.Rows[i]["ID"]; rowToBeMoved["PageName"] = dt.Rows[i]["PageName"]; break; } } switch (e.CommandName) { case "MoveUp": if (rowIndex > 0) { //delete the selected row dt.Rows[rowIndex].Delete(); dt.AcceptChanges(); //add the rowToBeMoved dt.Rows.InsertAt(rowToBeMoved, rowIndex - 1); dt.AcceptChanges(); DataGrid1.SelectedIndex = rowIndex - 1; } break; case "MoveDown": if (rowIndex < dt.Rows.Count - 1) { dt.Rows[rowIndex].Delete(); dt.AcceptChanges(); dt.Rows.InsertAt(rowToBeMoved, rowIndex + 1); dt.AcceptChanges(); DataGrid1.SelectedIndex = rowIndex + 1; } break; } Session["FilesOrder"] = dt; } void Page_Load(object sender, EventArgs e) { CreateDT(); } void Page_PreRender(object sender, EventArgs e) { if (dt != null) { DataGrid1.DataSource = dt; DataGrid1.DataBind(); } } private DataTable CreateDT() { if (Session["FilesOrder"] == null) { dt = new DataTable("FilesOrder"); DataRow dr; dt.Columns.Add(new DataColumn("ID", typeof(Int32))); dt.Columns.Add(new DataColumn("PageName", typeof(string))); Int16 i = 0; dr = dt.NewRow(); dr[0] = i++; dr[1] = "default.aspx"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "default.htm"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "default.asp"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "index.htm"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "index.aspx"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "index.asp"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "main.htm"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "main.aspx"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = i++; dr[1] = "main.asp"; dt.Rows.Add(dr); DataColumn[] PrimaryKeyColumns = new DataColumn[1]; PrimaryKeyColumns[0] = dt.Columns["ID"]; dt.PrimaryKey = PrimaryKeyColumns; Session["FilesOrder"] = dt; } else { dt = (DataTable)Session["FilesOrder"]; } return dt; } </script> <asp:Content ID="Content1" runat="server" ContentPlaceHolderID="MainContent"> <div style="width: 750px;"> <h2> DataGrid Rows Reordering </h2> <p> Unlike sorting the DataGrid based on an index field, re-ordering the rows, based on explicit user requests (to move a row up or down), is not as simple. </p> <p> The approach that one takes is very much dependent on the type of data structure one has bound to the datagrid. I can offer here 2 approaches:</p> <ol> <li>sort based on a rank field. Then upon moving up or down swap the value of that field with the previous or next record respectively. </li> <li>locate the record that is to be moved using the DataGrid.DataKeys collection while processing the DataGrid.ItemCommand event. I make a copy of that DataTableRow then delete the original one, acceptChanges on the DataTable, then re-insert it at the desired position (whether moving up or down). This approach can pose concurrency issues upon saving the table to the database because of the primary keys sequence. </li> </ol> <asp:DataGrid ID="DataGrid1" runat="server" DataKeyField="ID" AutoGenerateColumns="false" SelectedItemStyle-BackColor="Gold" ItemStyle-BackColor="White" > <HeaderStyle CssClass="Col1Header"></HeaderStyle> <Columns> <asp:TemplateColumn> <ItemTemplate> <asp:ImageButton runat="server" ToolTip="Click to move this row up" ImageUrl="~/App_Themes/WEBSWAPP/images/up.gif" ID="btnUp" CommandName="MoveUp" /> <asp:ImageButton runat="server" ToolTip="Click here to move this row down" ImageUrl="~/App_Themes/WEBSWAPP/images/down.gif" ID="ImageButton1" CommandName="MoveDown" /> </ItemTemplate> </asp:TemplateColumn> <asp:BoundColumn DataField="PageName" HeaderText="Page Name" > </asp:BoundColumn> </Columns> </asp:DataGrid> </div> </asp:Content>