<asp:datagrid id="dgTest" Runat="server" Width="90%"
EnableViewState="False" ShowHeader="True"
AutoGenerateColumns="False" GridLines="Horizontal"
BackColor="lightblue">
<HeaderStyle Wrap="False" Font-Bold="True" BackColor="#3300cc"
ForeColor="white"></HeaderStyle>
<AlternatingItemStyle BackColor="LawnGreen"></AlternatingItemStyle>
<Columns>
<asp:BoundColumn HeaderText="Last Name" DataField="LastName"
ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn HeaderText="First Name" DataField="FirstName"
ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn HeaderText="Address" DataField="Address"
ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn HeaderText="City" DataField="city"
ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn HeaderText="Region" DataField="Region"
ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn HeaderText="PostalCode" DataField="PostalCode"
ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn HeaderText="Country" DataField="Country"
ReadOnly="True"></asp:BoundColumn>
<asp:TemplateColumn>
<HeaderTemplate>
View Detail
</HeaderTemplate>
<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<ItemTemplate>
<asp:LinkButton ID="lnkSelect" Runat="server"
text="Select"></asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
<br>
<asp:Button ID="SortButton" style="DISPLAY:none" Runat="server"
Text="Sort"></asp:Button>
To transfer an event click to non-display button, modify head text and add some JavaScript as follows:
Collapse
private void SetHeadText(SORT_ORDER order)
{
string headtext = "<a href='#' onclick='javascript:document" +
".getElementById(\"{0}\").click();'> Address</a>";
if(order == SORT_ORDER.DESC)
{
this.dgTest.Columns[this.Col_Address].HeaderText =
string.Format(headtext,this.SortButton.ClientID);
}
else
{
this.dgTest.Columns[this.Col_Address].HeaderText =
string.Format(headtext,this.SortButton.ClientID);
}
}
In button event handler, add the following code. Sort order has been saved in page viewstate.
Collapse
private void SortButton_Click(object sender, System.EventArgs e)
{
SORT_ORDER order = (SORT_ORDER)ViewState[SORTORDER];
if(order == SORT_ORDER.ASC)
{
this.BindData(SORT_ORDER.DESC);
}
else
{
this.BindData(SORT_ORDER.ASC);
}
}
Next is bind data. SetHeadText must be called before calling DataGrid's DataBind function.
Collapse
private void BindData(SORT_ORDER order)
{
DataView dv = this.GetDataSource().DefaultView;
if(order == SORT_ORDER.ASC)
{
this.SetHeadText(SORT_ORDER.DESC);
this.ViewState[SORTORDER] = SORT_ORDER.ASC;
dv.Sort = "Address ASC";
this.SortLabel.Text = "Current sorting order is ascending";
}
else
{
this.SetHeadText(SORT_ORDER.ASC);
this.ViewState[SORTORDER] = SORT_ORDER.DESC;
dv.Sort = "Address DESC";
this.SortLabel.Text = "Current sorting order is descending";
}
this.dgTest.DataSource = dv;
dgTest.DataBind();
}
To minimize database access, we keep data in cache.
Collapse
private DataTable RetrieveDataFromDB()
{
string SelectString = "select * from Employees";
DataTable dt = new DataTable();
using(SqlDataAdapter adpt = new
SqlDataAdapter(SelectString,this.NorthWindConnStr ))
{
adpt.Fill(dt);
}
return dt;
}
private DataTable GetDataSource()
{
object o;
o = this.Cache[this.CacheKey];
if (o != null)
{
return (DataTable)o;
}
else
{
DataTable dt = RetrieveDataFromDB();
this.Cache.Add(this.CacheKey,dt,null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.TimeSpan.FromMinutes(this.CacheTimeSpan),
System.Web.Caching.CacheItemPriority.Normal,null);
return dt;
}
}