2

大家好,

拜托,我有一个小问题。有 2 页。在通过 Button1 的一页中,将文本和值(“123456”、“Jan Novak”)添加到列表框。我需要在另一个页面传输中从 Listbox 中获取这两个值。当我只有 1 个值时,这没问题,但是在列表框中并排“双”之后有 2 个值。

有我的代码。

Default.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Specialized;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
            if (Session["Session"] != null)
            {

                ListItemCollection hodnotyState = (ListItemCollection)Session["Session"];

                foreach (ListItem i in hodnotyState)
                {
                    ListBox1.Items.Add(i.Text + "|" + i.Value);

                }
                Session.Clear();
            }

        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        ListBox1.Items.Add(new ListItem("123456","Jan Novak"));
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        ListItemCollection kolekce = new ListItemCollection();

            foreach (ListItem i in ListBox1.Items)
            {

                kolekce.Add(i.Text + "|" + i.Value);

                Session["Session"] = kolekce;
            }
            Response.Redirect("page2.aspx");

    }
}        

page2.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Specialized;

public partial class page2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
            if (Session["Session"] != null)
            {

                ListItemCollection hodnotyState = (ListItemCollection)Session["Session"];

                foreach (ListItem i in hodnotyState)
                {
                    ListBox1.Items.Add(i.Text + "|" + i.Value);

                }
                Session.Clear();
            }
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        ListBox1.Items.Add(new ListItem("987654","John Smith"));
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        ListItemCollection kolekce = new ListItemCollection();


        Session.Clear();
            foreach (ListItem i in ListBox1.Items)
            {

                kolekce.Add(i.Text + "|" + i.Value);

                Session["Session"] = kolekce;
            }
            Response.Redirect("Default.aspx");

    }
}

否则这些文本+值不在列表框中,而是“并列”。有更好的经验吗?谢谢你们。

4

2 回答 2

3

问题是您将 Text 和 Value 粘合到这一行中的单个字符串中:kolekce.Add(i.Text + i.Value).

您有两个选择:
1)使用不同的集合来存储 KeyValuePair,这样您就可以将“键”和“值”分开

2) 将这些值一起添加到一个字符串中(就像您现在所做的那样),但使用分隔符 ( kolekce.Add(i.Text + "|" + i.Value))。当您回读该集合时,在该分隔符上拆分以获取单独的键和值。

在这两种情况下,不要将单个字符串添加到您的 ListBox1,而是添加一个ListItem具有单独键和值的新字符串。

例子:

如果您像这样存储列表:

StringCollection kolekce = new StringCollection();
foreach (ListItem i in ListBox1.Items)
{
    kolekce.Add(i.Text + "|" + i.Value);
}
Session["Session"] = kolekce;

(注意:在foreach循环之后存储在会话中,一次就足够了)
然后你需要这个来读回它:

if (Session["Session"] != null)
{
     StringCollection hodnotyState = (StringCollection)Session["Session"];

     foreach (string s in hodnotyState)
     {
         string[] sa = s.Split('|');
         ListBox1.Items.Add(new ListItem(sa[0], sa[1]);
     }
     Session.Remove("Session");
}
于 2013-03-05T11:51:22.570 回答
1

为什么不以您希望它们显示的方式添加它们,而不是在事后尝试这样做?

Default.aspx 函数:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Session["Session"] != null)
            {
                ListItemCollection hodnotyState = (ListItemCollection)Session["Session"];

                foreach (ListItem i in hodnotyState)
                {
                    ListBox1.Items.Add(i);
                }
                Session.Clear();
            }
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ListItem newItem = new ListItem("123456", "Jan Novak");
        ListBox1.Items.Add(new ListItem(newItem.Text + newItem.Value, newItem.Value));
    }

    protected void Button3_Click(object sender, EventArgs e)
    {
        ListItemCollection kolekce = new ListItemCollection();

        foreach (ListItem i in ListBox1.Items)
        {
            kolekce.Add(i);
        }
        Session["Session"] = kolekce;

        Response.Redirect("page2.aspx");
    }
}

和 page2.aspx 功能:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Session["Session"] != null)
            {
                ListItemCollection hodnotyState = (ListItemCollection)Session["Session"];

                foreach (ListItem i in hodnotyState)
                {
                    ListBox1.Items.Add(i);
                }
                Session.Clear();
            }
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ListItem newItem = new ListItem("987654", "John Smith");
        ListBox1.Items.Add(new ListItem(newItem.Text+newItem.Value, newItem.Value));
    }

    protected void Button3_Click(object sender, EventArgs e)
    {
        ListItemCollection kolekce = new ListItemCollection();
        Session.Clear();
        foreach (ListItem i in ListBox1.Items)
        {
            kolekce.Add(i);
        }
        Session["Session"] = kolekce;

        Response.Redirect("Default.aspx");
    }
}
于 2013-03-04T16:21:18.450 回答