I have GridView that I use to show a grid of book titles and related information. I have a Repeater Control on the same page that displays an alphabet list of LinkButtons that is used to control the group of books shown. In short when I select the "B" link button all I see is a grid of books that have titles starting with "B."
My problem comes when the number of books in an alphabetic group exceeds my GridView property PageSize="15". When paging beyond the first page I apparently need to reacquire the Text value of the already selected LinkButton in the Repeater control so that I can place it in the database Select statement. How does the GridView1_PageIndexChanging know what LinkButton.Text value to put into 'myAlpha' in the Select statement?
<asp:Repeater ID="FilteringUI" runat="server"
onitemcommand="FilteringUI_ItemCommand" >
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkFilter"
Text='<%# Container.DataItem %>'
CommandName='<%# Container.DataItem %>' >
</asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" AllowPaging="True" PageSize="15"
PagerSettings-PageButtonCount="25"
OnPageIndexChanging="GridView1_PageIndexChanging"
PagerSettings-Mode="NumericFirstLast"
PagerSettings-Position="TopAndBottom"
>
<Columns>
<asp:BoundField HeaderText="title" DataField="titlelink" />
<asp:BoundField DataField="imagelink" />
<asp:BoundField HeaderText="Description" DataField="desc" />
</Columns>
</asp:GridView>
private void BindFilteringUI()
{
string[] filterOptions = { "1-9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y" };
FilteringUI.DataSource = filterOptions;
FilteringUI.DataBind();
}
protected void Grid_Fill()
{
string selectSQL;
selectSQL = "select title, titlelink + author as titlelink, imagelink, [desc] ";
selectSQL += " from tblbooks ";
selectSQL += " where left(title, 1) " + myAlpha + " order by title ";
DataTable dt = new DataTable();
SqlConnection con = new SqlConnection(connectionString);
try
{
con.Open();
SqlCommand cmd = new SqlCommand(selectSQL, con);
SqlDataAdapter sqlDa = new SqlDataAdapter(cmd);
sqlDa.Fill(dt);
if (dt.Rows.Count > 0)
{
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Fetch Error:";
msg += ex.Message;
throw new Exception(msg);
}
finally
{
con.Close();
}
}
protected void FilteringUI_ItemCommand(object source, RepeaterCommandEventArgs e)
{
switch (e.CommandName)
{
case "1-9":
myAlpha = " in ('0','1','2','3','4','5','6','7','8','9') ";
break;
case "A":
myAlpha = " ='A' ";
break;
case "B":
myAlpha = " ='B' ";
break;
case "C":
myAlpha = " ='C' ";
break;
// etc. . . .
}
}
protected void GridView1_PageIndexChanging(object sender, EventArgs e)
{
//essentially the same as Grid_Fill()
string selectSQL;
selectSQL = "select title, titlelink + author as titlelink, imagelink, [desc] ";
selectSQL += " from tblbooks ";
selectSQL += " where left(title, 1) " + myAlpha + " order by title ";
DataTable dt = new DataTable();
SqlConnection con = new SqlConnection(connectionString);
try
{
con.Open();
SqlCommand cmd = new SqlCommand(selectSQL, con);
SqlDataAdapter sqlDa = new SqlDataAdapter(cmd);
sqlDa.Fill(dt);
if (dt.Rows.Count > 0)
{
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Fetch Error:";
msg += ex.Message;
throw new Exception(msg);
}
finally
{
con.Close();
}
}