<%@ 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>