C# 从下拉列表中删除选定项目始终删除顶部的项目

C# 从下拉列表中删除选定项目始终删除顶部的项目,c#,asp.net,C#,Asp.net,我有两个asp.net页面,将使用Response.Redirect(“summary.aspx”)从第一个asp.net页面调用summary.aspx Ticket是一个自定义类,具有4个属性(stringname、int-age、int-seat、int-price),它们的getter和setter以及一个ToString方法 Session[“tickets”]存储Ticket类的对象 我的问题是我有一个名为drop\u remove的下拉列表和一个名为btn\u remove的按钮。

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

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

Session[“tickets”]
存储Ticket类的对象

我的问题是我有一个名为
drop\u remove
的下拉列表和一个名为
btn\u remove
的按钮。当我单击按钮时,它将删除所选项目并从
列表票据中删除相应的对象。但是,它总是从dropdownlist中删除顶部项目。我是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;
    }
}
公共部分类摘要:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
列表票证=(列表)会话[“票证”];
if(会话[“eventName”].ToString()!=null)
{
label_event.Text=会话[“eventName”].ToString();
}
如果(票证!=null)
{
门票;
}
if(会话[“票证”]==null)
{
票证=新列表();
}
其他的
{
票证=(列表)会话[“票证”];
drop_remove.Items.Clear();
foreach(票证中的票证a)
{
drop_remove.Items.Add(a.name.ToString());
}
}    
}
受保护的void moreTicekts\u单击(对象发送方,事件参数e)
{
重定向(“default.aspx”);
}
私人票证(列出票证)
{
TextBox1.Text=“”;
System.Text.StringBuilder=新的System.Text.StringBuilder();
builder.Append(Environment.NewLine);
foreach(票证中的票证a)
{
Append(a.ToString()+Environment.NewLine);
}
TextBox1.Text+=builder.ToString();
}
受保护的无效btn\u删除\u单击(对象发送方,事件参数e)
{
列表票证=(列表)会话[“票证”];
对于(int i=0;i
问题在于每次回发时,您都会清除
删除
内部页面加载。因此,所选项目已从列表中删除,因为每个项目都将重新创建。然后,默认情况下,顶部项目变为选中项目

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

公共部分类摘要:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
列表票证=(列表)会话[“票证”];
//下面是代码的其余部分
}
}
...
}

可能重复的@Charlie我可以从下拉列表中删除项,但它总是删除最顶端的项,而不是加载页面上的选定项
尝试在
中添加代码,如果(!IsPostBack){//your code}
是否附加了调试器以查看SelectedItem返回的内容?不建议在会话中存储列表;它的伸缩性不好。在将其设置为新列表之前,也不需要将其设置为null。
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
       }
   }
   ...
}