【问题标题】:ASP .NET c# Add List<Object> to ListView afer DataBildASP .NET c# 将 List<Object> 添加到 DataBild 之后的 ListView
【发布时间】:2016-05-15 15:27:33
【问题描述】:

我今天面临一个非常奇怪的问题。 我创建了一个 DropDownList,它将所选项目添加到列表中。 List 将绑定到 ListView。

这是下拉菜单:

<asp:DropDownList ID="ddlChooseNewApplication" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="True">
        <asp:ListItem Selected="True">Bitte wählen</asp:ListItem>
        <asp:ListItem Value="windows">Windows</asp:ListItem>
        <asp:ListItem Value="mail">E-Mail</asp:ListItem>
        <asp:ListItem Value="app1">App1</asp:ListItem>
        <asp:ListItem Value="app2">App2</asp:ListItem>
        <asp:ListItem Value="app3">App3</asp:ListItem>
</asp:DropDownList>

接下来,当一个项目被点击时,它会运行以下代码:

//This is a global variable
List<NewApplicationModels> applicationName = new List<NewApplicationModels>(); 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string value = ddlChooseNewApplication.SelectedValue.ToString();

        applicationName.Add(new NewApplicationModels(){ ApplicationName = value});
        ListViewNewApplications.DataSource = applicationName;
        ListViewNewApplications.DataBind();
    }

它将被添加到 List 中,这应该将所选应用程序添加到 ListView 中,如下所示:

<asp:ListView ID="ListViewNewApplications" runat="server">
    <ItemTemplate>
        <br /><br />
        <%# Eval("ApplicationName") %><br />

        <asp:Label ID="Label3" runat="server" Text="Titel"></asp:Label><br />
        <asp:TextBox ID="tbNewTitle" runat="server"></asp:TextBox><br /><br />

        <asp:Label ID="Label4" runat="server" Text="Beschreibung"></asp:Label><br />
        <asp:TextBox ID="tbNewDescription" runat="server" TextMode="MultiLine"></asp:TextBox><br /><br />
        </div>
    </ItemTemplate>
</asp:ListView>

将单个项目添加到 ListView 有效。问题是,如果我在 DropDown 中选择了一个新的 Item,ListView 中的当前对象将被覆盖。我希望它在当前项目下创建一个新项目。 哪里错了?

在此先感谢

【问题讨论】:

  • 您在调试模式下运行了吗?当您为 Listview 设置 Datasource 时,List applicationName 有什么?只有 1 件或更多?
  • @PhamX.Bach 一直是一个项目。插入项目可能有错误。有什么想法吗?
  • 然后我说列表applicationNamea global variable。您应该在它的定义行中放置一个调试标志,并在每次更改下拉列表时检查它是否被重置(= new List<....>
  • 您应该将applicationName 列表保存在 ViewState 或 Session 变量中,以便它在回发中持续存在。
  • 您可以使用static List,这样回发时它不会被重置。无论如何,您能否检查一下我的代码在您的情况下是否运行正常,if (!applicationName.Any(item =&gt; item.ApplicationName == value)) 行?

标签: c# asp.net listview web


【解决方案1】:

已编辑:只是 read here static property 是每个应用程序域,而不是每个用户,所以解决方案应该改为使用 Session State

//Add using on top of .cs
using System.Linq;

//In cs class
public partial class name_of_class : Page
{
    private List<NewApplicationModels> applicationName = new List<NewApplicationModels>(); 

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
             //Do page_load stuff....
             Session.Remove("name_here");  //reset the Session when first page load
        }
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Get List from Session
        applicationName = (List<NewApplicationModels>)Session["name_here"]; 
        if (applicationName == null)
            applicationName = new List<NewApplicationModels>(); 

        string value = ddlChooseNewApplication.SelectedValue.ToString();
        if (!applicationName.Any(item => item.ApplicationName == value))   
        {
            applicationName.Add(new NewApplicationModels(){ ApplicationName = value});
            Session["name_here"] = applicationName;

            ListViewNewApplications.DataSource = applicationName;
            ListViewNewApplications.DataBind();
        }
    }
}

static property 是每个应用程序域,来自 2 个不同地方的 2 个陌生人浏览同一服务器(应用程序域)中的同一页面都会看到它。

这意味着当用户A更改下拉列表2次并且列表视图有2个项目,然后用户B浏览并更改下拉列表,他可能会在列表视图中获得3个项目,用户A的2个和他最近选择的1个(他也可能什么也没有得到)。

【讨论】:

  • 亲爱的@Manuel Bürge,我刚刚发现我的最后一个答案是bad 解决方案。我已经编辑并更改了带有解释的解决方案。我认为您应该阅读并更改您的实现以使用Session
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2014-05-13
  • 1970-01-01
  • 2022-12-04
  • 2021-01-21
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多