【问题标题】:Remove selected item from a DropDownList always removes the item on top从 DropDownList 中删除所选项目始终会删除顶部的项目
【发布时间】:2018-04-06 02:26:56
【问题描述】:

我有两个 asp.net 页面,summary.aspx 将使用 Response.Redirect("summary.aspx") 从第一个 asp.net 页面调用。

Ticket 是一个自定义类,具有 4 个属性 (String name, int age, int seat, int price)、它们的 getter 和 setter 以及一个 ToString 方法。

Session["tickets"]存放Ticket类的对象

我的问题是我有一个名为drop_remove 的下拉列表和一个名为btn_remove 的按钮。当我单击按钮时,它应该删除选定的项目并从List<Ticket> tickets 中删除相应的对象。但是,它总是从下拉列表中删除最上面的项目。我是asp.net的新手,请帮忙。

public partial class summary : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Ticket> tickets = (List<Ticket>)Session["tickets"];

        if (Session["eventName"].ToString() != null)
        {
            label_event.Text = Session["eventName"].ToString();
        }

        if (tickets != null)
        {
            displayTickets(tickets);
        }


        if (Session["tickets"] == null)
        {
            tickets = new List<Ticket>();
        }
        else
        {
            tickets = (List<Ticket>)Session["tickets"];
            drop_remove.Items.Clear();
            foreach (Ticket a in tickets)
            {
                drop_remove.Items.Add(a.name.ToString());
            }
        }    
    }

    protected void moreTicekts_Click(object sender, EventArgs e)
    {
        Response.Redirect("default.aspx");
    }


    private void displayTickets(List<Ticket> tickets)
    {
        TextBox1.Text = ""; 
        System.Text.StringBuilder builder = new System.Text.StringBuilder();

        builder.Append(Environment.NewLine);
        foreach (Ticket a in tickets)
        {
            builder.Append(a.ToString() + Environment.NewLine);
        }
        TextBox1.Text += builder.ToString();
    }

    protected void btn_remove_Click(object sender, EventArgs e)
    {
        List<Ticket> tickets = (List<Ticket>)Session["tickets"];


        for (int i = 0; i < tickets.Count; i++)
        {
            if (tickets[i].name.Equals(drop_remove.SelectedItem.ToString()))
            {
                drop_remove.Items.Remove(drop_remove.SelectedItem);
                tickets.RemoveAt(i);
                break;
            }
        }

        Session["tickets"] = null;
        Session["tickets"] = tickets;
    }
}

【问题讨论】:

  • @Charlie 我可以从下拉列表中删除项目,但它总是删除最顶部的项目而不是选定的项目
  • Page_Load 上尝试在if (!IsPostBack) { // Your code } 中添加您的代码
  • 您是否附加了调试器以查看 SelectedItem 返回的内容?不建议在 Session 中存储列表;它不会很好地扩展。在将其设置为新列表之前,您也无需将其设置为 null。

标签: c# asp.net


【解决方案1】:

问题在于,在每次回发时,您都会清除 Page_Load 中的 drop_remove。结果,选定的项目已从列表中删除,因为每个项目都被重新创建。然后,顶部项目默认成为选中项目。

正如 Wael Abbas 所说,您需要将这些代码放在 if (!IsPostBack) 中。

public partial class summary : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
       if (!IsPostBack) 
       {
            List<Ticket> tickets = (List<Ticket>)Session["tickets"];

            // the rest of the code here
       }
   }
   ...
}

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 2020-02-11
    • 2016-04-23
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多