Reputation: 65
As of right now I am trying to create an ASP.NET page which will list books from a category, in a listbox based upon which category button you choose and then I have another two buttons (one for DESC order and one for ASC order). Now the issue is when I click on the ASC or DESC button after hitting the fiction button and populating the list box it wipes the list box.
I posted a similar question earlier, got some fixes, but it is still wiping the listbox when I hit the ASC or DESC buttons.
I'm pretty new to ASP.NET so simple or "newb-friendly" explanations and code-examples/fixes are very welcome!
Thanks in advance!
Code Below
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class partin : System.Web.UI.Page
{
private List<String> books = new List<String>();
void Page_PreRender()
{
Item_Listbox.DataSource = books;
Item_Listbox.DataBind();
}
int SortASC(string x, string y)
{
return String.Compare(x, y);
}
int SortDESC(string x, string y)
{
return String.Compare(x, y) * -1;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Header_Label.Text = "Welcome! Please select a book category.";
Item_Listbox.DataSource = books;
Item_Listbox.DataBind();
}
}
protected void Fiction_Click(object sender, EventArgs e)
{
Header_Label.Text = "Fiction Section";
books.Add("Title: The Old Man and The Sea | Decription: An epic novel. | Price: 10 USD | Quantity: 3");
books.Add("Title: A Game of Thrones | Decription: A tale of fire and ice. | Price: 15 USD | Quantity: 6");
books.Add("Title: Dracula | Decription: A book about vampires. | Price: 5 USD | Quantity: 7");
books.Add("Title: Twilight | Decription: An awful book. | Price: Free | Quantity: 1000");
Item_Listbox.DataSource = books;
Item_Listbox.DataBind();
}
protected void Non_Fiction_Click(object sender, EventArgs e)
{
Header_Label.Text = "Non-Fiction Section";
}
protected void Self_Help_Click(object sender, EventArgs e)
{
Header_Label.Text = "Self Help Section";
}
protected void Sort_Command(object sender, CommandEventArgs e)
{
if (e.CommandName == "Sort")
{
switch (e.CommandArgument.ToString())
{
case "ASC":
books.Sort(SortASC);
break;
case "DESC":
books.Sort(SortDESC);
break;
}
}
Item_Listbox.DataSource = books;
Item_Listbox.DataBind();
}
}
ASPX Code:
<asp:Panel
ID="Navigation" runat="server" Height="276px" Width="197px"
CssClass="Navigation" BorderColor="Black" BorderStyle="Double">
<asp:Button ID="Fiction" runat="server" Text="Fiction" Width="145px"
CssClass="Nav_buttons" onclick="Fiction_Click" />
<asp:Button ID="Non_Fiction" runat="server" Text="Non-Fiction" Width="145px"
CssClass="Nav_buttons" onclick="Non_Fiction_Click" />
<asp:Button ID="Self_Help" runat="server" Text="Self Help" Width="145px"
CssClass="Nav_buttons" onclick="Self_Help_Click" />
<asp:Button ID="New_Item" runat="server" Text="Add New Item" Width="145px" CssClass="Nav_buttons" />
</asp:Panel>
<asp:Panel ID="Books_Panel" runat="server" CssClass="Books_Panel" Height="409px"
BorderStyle="Double">
<asp:Label ID="Header_Label" runat="server"
style="top: 79px; left: 693px; position: absolute; height: 19px; width: 234px"
Text="Label"></asp:Label>
<asp:ListBox ID="Item_Listbox" runat="server"
style="top: 204px; left: 443px; position: absolute; height: 136px; width: 732px"
AutoPostBack="True">
</asp:ListBox>
<asp:Button ID="Ascending_Button" runat="server"
style="top: 375px; left: 723px; position: absolute; height: 26px; width: 169px"
Text="Ascending Order" CommandName="Sort" CommandArgument="ASC"
OnCommand="Sort_Command" />
<asp:Button ID="Descending_Button" runat="server"
style="top: 405px; left: 723px; position: absolute; height: 26px; width: 169px"
Text="Descending Order" CommandName="Sort" CommandArgument="DESC"
OnCommand="Sort_Command" />
<asp:DropDownList ID="Cat_Menu" runat="server">
</asp:DropDownList>
</asp:Panel>
Upvotes: 1
Views: 1187
Reputation: 69905
When you click on ASC or DESC button to sort the list it goes to sort handler but here books
is empty on page postback so the empty datasource is bound to the list.
You should either rebind the source or maintain it in a viewstate so that it can be used on page post back.
Try something like this.
private List<String> books
{
get{
if(ViewState["books"] == null){
List<String> books = new List<String>();
books.Add("Title: The Old Man and The Sea | Decription: An epic novel. | Price: 10 USD | Quantity: 3");
books.Add("Title: A Game of Thrones | Decription: A tale of fire and ice. | Price: 15 USD | Quantity: 6");
books.Add("Title: Dracula | Decription: A book about vampires. | Price: 5 USD | Quantity: 7");
books.Add("Title: Twilight | Decription: An awful book. | Price: Free | Quantity: 1000");
ViewState["books"] = books;
}
return new List<String>((String[])ViewState["books"]);
}
set{
ViewState["books"] = value;
}
}
protected void Fiction_Click(object sender, EventArgs e)
{
Header_Label.Text = "Fiction Section";
Item_Listbox.DataSource = books;
Item_Listbox.DataBind();
}
protected void Sort_Command(object sender, CommandEventArgs e)
{
if (e.CommandName == "Sort")
{
switch (e.CommandArgument.ToString())
{
case "ASC":
books.Sort(SortASC);
break;
case "DESC":
books.Sort(SortDESC);
break;
}
}
Item_Listbox.DataSource = books;
Item_Listbox.DataBind();
}
Upvotes: 1