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