Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在OnInit中创建的列表未持久化_C#_Asp.net - Fatal编程技术网

C# 在OnInit中创建的列表未持久化

C# 在OnInit中创建的列表未持久化,c#,asp.net,C#,Asp.net,我在维护字符串列表时遇到问题。该列表在OnInit中实例化,并设置为GridView的数据源。(基本思想是用户在文本框中输入一些内容,并在GridView中显示任意次数。) 对于第一个条目,它工作得很好,无论用户输入什么,都会显示在GridView中,尽可能漂亮。但是,在以下条目上,以前输入的任何值都将消失-OnInit将再次执行,列表将重新实例化,以前的值将被重写。我尝试将OnInit逻辑移动到OnPreInit中,但列表中出现了一个空引用异常 下面是我试图做的一个人为的例子: 我有一个文本框

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

对于第一个条目,它工作得很好,无论用户输入什么,都会显示在
GridView
中,尽可能漂亮。但是,在以下条目上,以前输入的任何值都将消失-
OnInit
将再次执行,列表将重新实例化,以前的值将被重写。我尝试将
OnInit
逻辑移动到
OnPreInit
中,但列表中出现了一个空引用异常

下面是我试图做的一个人为的例子:

我有一个
文本框
、一个
按钮
和一个
网格视图

<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();
}
protected override void OnInit(事件参数e)
{
List gvValues=新列表();
GridView1.DataSource=gvValues;
GridView1.DataBind();
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
gvValues.Add(TextBox1.Text);
GridView1.DataBind();
}

我以前在
OnInit
中创建过对象,它们的状态持久化没有问题。很明显,我遗漏了一些东西。请有人指出我的逻辑中的缺陷,并建议实现此功能的方法。

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

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;
  }
}
protected override void OnInit(事件参数e)
{
GridView1.DataSource=GvValues;
GridView1.DataBind();
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
GvValues.Add(TextBox1.Text);
GridView1.DataSource=GvValues;
GridView1.DataBind();
}
私有列表值
{
得到
{
如果(会话[“列表”]!=null)
{
返回(列表)会话[“列表”];
}
返回新列表();
}
设置
{
会话[“列表”]值;
}
}

以下代码经过测试,可以正常工作

// 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 
//ASPX代码
//代码隐藏
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
List gvValues=新列表();
GridView1.DataSource=gvValues;
GridView1.DataBind();
会话[“数据”]=gvValues;
}
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
列表lt=新列表();
lt=(列表)会话[“数据”];
lt.Add(TextBox1.Text);
GridView1.DataSource=lt;
GridView1.DataBind();
会话[“数据”]=lt;//将其保存在会话中,以便下次可用
}
//逐个添加这些值,它将显示所有值
//输出
试验
测试1
测试2

我做了一个很好的小例子

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();
}
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!Page.IsPostBack)
{
列表源=新列表();
来源。添加(“条目1”);
来源。添加(“条目2”);
来源。添加(“条目3”);
会话[“源”]=源;
gvEntries.DataSource=源;
gvEntries.DataBind();
}
}
受保护的无效btnSave\u单击(对象发送方,事件参数e)
{
列表源=(列表)会话[“源”];
添加(txtNewEntry.Text);
gvEntries.DataSource=源;
gvEntries.DataBind();
}

此示例在pageLoad(GET)上绑定初始数据。因此,数据源存储在gridviews视图状态中。如果要添加另一个条目,则必须访问原始源,该源已存储在会话变量中。因此,获取对它的引用,添加一个值,然后重新绑定数据源。

add wait您必须将gvValues设置为全局,我将编辑我的答案。在
Page\u Load
OnInit
中尝试此操作,它只会导致一个空引用异常。很酷,这很有效。我会接受一点,但我想看看是否有其他的解决办法。