我在维护字符串列表时遇到问题。该列表在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
创建了对象,并且在状态持续存在时没有问题。显然我在这里遗漏了一些东西。有人请指出我的逻辑中的缺陷,并提出一种实现此功能的方法。
答案 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。