在OnInit中创建的列表不会持久化

时间:2012-08-29 19:25:35

标签: c# asp.net

我在维护字符串列表时遇到问题。该列表在OnInit中实例化,并设置为GridView的数据源。 (基本思想是用户在文本框中输入内容,并在GridView中显示,可以根据需要多次显示。)

它适用于第一个条目,无论用户输入的是GridView中显示的内容,都可以。但是,在以下条目中,任何先前输入的值都将消失 - 再次执行OnInit,重新实例化List<string>,并覆盖先前的值。我尝试将OnInit逻辑移到OnPreInit但是在列表中只有一个空引用异常。

这是我正在尝试做的一个人为的例子:

我有TextBoxButtonGridview

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Add"
     onclick="Button1_Click" />
<asp:GridView ID="GridView1" runat="server"
    AutoGenerateColumns="true"></asp:GridView>

在背后的代码中:

protected override void OnInit(EventArgs e)
{
    List<string> gvValues = new List<string>();
    GridView1.DataSource = gvValues;
    GridView1.DataBind();
}

protected void Button1_Click(object sender, EventArgs e)
{
     gvValues.Add(TextBox1.Text);
     GridView1.DataBind();
}

我过去在OnInit创建了对象,并且在状态持续存在时没有问题。显然我在这里遗漏了一些东西。有人请指出我的逻辑中的缺陷,并提出一种实现此功能的方法。

3 个答案:

答案 0 :(得分:1)

您是否尝试将列表重新分配给gridview并将gvValues放入会话中:

protected override void OnInit(EventArgs e)
{
    GridView1.DataSource = GvValues;
    GridView1.DataBind();
}

protected void Button1_Click(object sender, EventArgs e)
{
     GvValues.Add(TextBox1.Text);
     GridView1.DataSource = GvValues;
     GridView1.DataBind();
}

private List<string> GvValues
{
  get
  {
    if(Session["list"] != null)
    {
      return (List<string>)Session["list"];
    }

     return new List<string>();
  }

  set
  {
    Session["list"] value;
  }
}

答案 1 :(得分:1)

以下代码经过测试,可以正常使用。

// ASPX Code
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
 <asp:Button ID="Button1" runat="server" Text="Add"
 onclick="Button1_Click" />
 <asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="true"></asp:GridView>

// Code Behind
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        List<string> gvValues = new List<string>();
        GridView1.DataSource = gvValues;
        GridView1.DataBind();
        Session["Data"] = gvValues;
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    List<string> lt = new List<string>();
    lt = (List<String>)Session["Data"];
    lt.Add(TextBox1.Text);
    GridView1.DataSource = lt;
    GridView1.DataBind();
    Session["Data"] = lt; // Save it in Session, so next time available
}

// Add the values one by one, and it will show you all the values
// OUTPUT
  Test
  Test1
  Test2 

答案 2 :(得分:0)

我做了一个小例子,对我来说很好用

<强>的Default.aspx

<form id="form1" runat="server">
    <asp:GridView ID="gvEntries" runat="server" AutoGenerateColumns="true">
    </asp:GridView>
    <asp:TextBox ID="txtNewEntry" runat="server"></asp:TextBox>
    <asp:Button ID="btnSave" runat="server" Text="Save entry" OnClick="btnSave_Click" />
</form>

<强> default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        List<string> source = new List<string>();
        source.Add("entry1");
        source.Add("entry2");
        source.Add("entry3");
        Session["source"] = source;
        gvEntries.DataSource = source;
        gvEntries.DataBind();
    }
}
protected void btnSave_Click(object sender, EventArgs e)
{
    List<string> source = (List<string>)Session["source"];
    source.Add(txtNewEntry.Text);
    gvEntries.DataSource = source;
    gvEntries.DataBind();
}

此示例在pageLoad (GET)上绑定 初始数据。因此,您的数据源存储在gridviews viewstate中。如果您要添加其他条目,则必须访问原始来源 - 其中 存储在Session-var 中。因此,获取对它的引用,添加一个值,然后重新绑定dataSource。