1

我在维护字符串列表时遇到问题。该列表在 OnInit 中实例化并设置为GridView. (基本思想是用户在文本框中输入一些内容,然后它会出现在 中GridView,想多少次就多少次。)

它适用于第一个条目,无论用户输入什么都显示在 中GridView,尽可能漂亮。但是,在随后的条目中,任何先前输入的值都会消失 -OnInit再次执行,List<string>重新实例化,并且先前的值被覆盖。我尝试将OnInit逻辑移入OnPreInit,但列表中出现了空引用异常。

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

我有一个TextBox,一个Button和一个Gridview

<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,并且它们的状态持续存在没有问题。显然我在这里遗漏了一些东西。有人请指出我的逻辑中的缺陷并提出实现此功能的方法。

4

3 回答 3

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;
  }
}
于 2012-08-29T19:29:28.273 回答
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 
于 2012-08-29T19:35:01.750 回答
0

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

默认.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>

默认.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 视图状态中。如果您想添加另一个条目,您必须访问您的原始源- 它已存储在 Session-var中。所以获取它的引用,添加一个值,然后重新绑定你的数据源。

于 2012-08-29T20:00:54.597 回答