C# 具有状态的ASP.net listview

C# 具有状态的ASP.net listview,c#,asp.net,webforms,C#,Asp.net,Webforms,我在ASP.net前端有一个动态列表。用户可以单击按钮并添加任意数量的条目 我正在使用ViewState保存此数据: if(ViewState["items"] != null) { ListItems.DataSource = ViewState["items"]; } ListItems.DataBind(); 还有一个回调,如下所示: protected void AddItemClick(object sender, EventArgs e) { L

我在ASP.net前端有一个动态列表。用户可以单击按钮并添加任意数量的条目

我正在使用ViewState保存此数据:

if(ViewState["items"] != null)
{
    ListItems.DataSource = ViewState["items"];
}          
ListItems.DataBind();
还有一个回调,如下所示:

protected void AddItemClick(object sender, EventArgs e)
{
    List<UserEntry> ue;
    if (ViewState["items"] == null)
    {
        ue = new List<UserEntry>();
    }
    else
    {
        ue = (List<UserEntry>)ViewState["items"];
    }
    ue.Add(new UserEntry());
    ViewState["items"] = ue;
}
protectedvoid AddItemClick(对象发送方,事件参数e)
{
列表ue;
if(ViewState[“items”]==null)
{
ue=新列表();
}
其他的
{
ue=(列表)视图状态[“项目”];
}
添加(newuserentry());
ViewState[“items”]=ue;
}
它工作正常,问题是,每次我添加一个新项目时,我都会丢失在其他行中输入的所有数据。我如何保存这些信息

编辑: 我在.aspx页面上调用它:

<asp:ListView ID="ListItems" class="block" SortExpression="DataType" ItemStyle-Wrap="false"  runat="server">
    <ItemTemplate  >
        <table>
            <tr>
                <asp:TextBox ID="Name" runat="server" class="inline" Text='<%# Eval("text") %>'></asp:TextBox>

            </tr>
        </table>
    </ItemTemplate>
</asp:ListView>


提前感谢

您在哪里调用此方法?你是在同一页打电话吗?在构造列表之前,可能要将其分配给ListItems控件

protected void AddItemClick(object sender, EventArgs e)
{
    List<UserEntry> ue;
    if (ViewState["items"] == null)
    {
        ue = new List<UserEntry>();
    }
    else
    {
        ue = (List<UserEntry>)ViewState["items"];
    }
    ue.Add(new UserEntry());
    ViewState["items"] = ue;
    ListItems.DataSource = ue;
    ListItems.DataBind();
}
protectedvoid AddItemClick(对象发送方,事件参数e)
{
列表ue;
if(ViewState[“items”]==null)
{
ue=新列表();
}
其他的
{
ue=(列表)视图状态[“项目”];
}
添加(newuserentry());
ViewState[“items”]=ue;
ListItems.DataSource=ue;
DataBind();
}

在这一行中,您可以在ViewState中添加时将集合分配给List和bind。

可能需要检查以下几点:

  • 如果在
    Page\u Load
    上将值分配给
    ViewState
    ,那么您可能不会检查它是否是
    postback
    ,或者为了克服它,您只需在
    If
    条件中对
    列表项
    执行值分配部分:
    If(!Page.IsPostback){/*do stuff*/}
  • 每次修改列表时,您可能需要绑定
    列表项
  • 您可以简单地调整代码,看看问题出在哪里没有人能比您更好地帮助您调查代码
  • 最后,您可能想跳过ViewState,您可以做的是:

    protected void AddItemClick(object sender, EventArgs e)
    {
        List<UserEntry> ue = (List<UserEntry>)ListItems.DataSource;
        if(ue == null)
        {
           ue = new List<UserEntry>();
        }
        ue.Add(new UserEntry());
        ListItems.DataSource = ue;
        ListItems.DataBind();
    } // Just an idea though
    
    protectedvoid AddItemClick(对象发送方,事件参数e)
    {
    List ue=(List)ListItems.DataSource;
    如果(ue==null)
    {
    ue=新列表();
    }
    添加(newuserentry());
    ListItems.DataSource=ue;
    DataBind();
    }//不过这只是个主意
    

  • 我已经将数据绑定到ListItems。问题是我不能保存用户在网页中添加的信息。我的意思是,当我点击按钮时,它确实添加了一个新的文本框来写入,但是我丢失了我在所有其他条目中写入的所有内容。我如何保存这些信息?第二点你是对的,但是,我怎么做呢?检查第四个选项。您只需将
    用户条目
    列表附加到
    列表项
    数据源