ASP.NET Populating Listbox issue

我与影子孤独终老i 提交于 2019-12-23 01:05:39

问题


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:

    &nbsp;<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>

回答1:


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();  
}


来源:https://stackoverflow.com/questions/9027533/asp-net-populating-listbox-issue

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!