【问题标题】:C# Adding item into List<> doesn't increase its sizeC# 将项目添加到 List<> 不会增加其大小
【发布时间】:2015-03-04 20:48:31
【问题描述】:

我在 ASP.NET 中玩了一下,这里有一些显示列表大小的代码和一些操作它的按钮。

我已分离类以使用构造函数创建列表。这里也是增加其大小的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


public class Class1
{
    public List<byte> Pole { get; set; }
    public int velikost_pole { get; set; }  //list size

    public Class1()                         //constructor, default size is 3
    {
        List<byte> pole = new List<byte>();
        for (byte a = 0; a < 3; a++)
        {
            pole.Add((byte)(a * a));
        }
        Pole = pole;
        velikost_pole = Pole.Count;
    }
    public string zvetsit_pole()            //method to increase the list size by adding item
    {
        if (Pole.Count < 6)                 //max size
        {
            Pole.Add((byte)(Pole.Count*Pole.Count+1));
            velikost_pole = Pole.Count;
            return "Pole zvetseno o 1";
        }
        else
        {
            return "Jiz nelze zvetsit";
        }
    }
}

在主文件中,对象被创建为全局变量,并且有一个增加列表大小的按钮。但是大小不变,还是一样

public partial class _Default : System.Web.UI.Page
{
    Class1 objekt = new Class1();                   //create the object

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Velikost pole je: " + objekt.velikost_pole.ToString() + "<br />";
        for (int a=0;a<objekt.velikost_pole;a++)
        {
            Label1.Text += objekt.Pole[a].ToString() + "&nbsp";
        }
    }
    protected void Button2_Click(object sender, EventArgs e)    //call method to increase the size
    {
        Label1.Text = objekt.zvetsit_pole();
    }

}

感谢您的想法。

【问题讨论】:

  • 您的 Button2_Click 方法真的被调用了吗?当然,您必须将其添加到按钮的单击事件中,尽管这可以由设计人员或您自己编写代码来完成。
  • 对于每个请求,都会创建一个新的代码隐藏文件实例,因此也会创建 Class1 的新实例。

标签: c# asp.net list


【解决方案1】:

请记住,ASP.NET 是无状态,因此每个请求都会创建一个全新的Page 对象。所以你的活动时间线如下所示:

  • 请求页面
    • Page 已创建
    • objekt 已创建
    • 页面渲染
  • 按钮 1 已单击
    • Page 已创建
    • objekt 已创建(不是与第一个请求相同的对象)
    • Label1.Text设置
    • 页面渲染
  • 按钮 2 已单击
    • Page 已创建
    • objekt 创建(不是与前两个请求中的任何一个相同的对象)
    • zvetsit_pole 调用
    • Label1.Text设置为返回值
    • 页面渲染

所以按钮点击事件处理的是不同的对象,所以在下一个动作中看不到一个动作的结果。

答案是将objekt 放入某种持久存储中,例如ViewStateCacheSession。如果您不知道哪个适合您的需求,请进行一些研究并自行决定。

【讨论】:

  • 好吧,那好吧。谢谢
【解决方案2】:

每个请求都会创建一个_Default 类的新实例,相应地,objekt 也将是Class1 的一个新实例。

这意味着您在一个请求中对objekt 所做的任何更改都不会反映在下一个请求中。

为了使更改在请求之间持久存在,您需要将它们存储在某个地方。有不同的选项可以做到这一点,一些涉及使用用户的会话,其他使用页面的视图状态或者可能将状态持久化到磁盘。你选择哪一个取决于你到底想完成什么。

有关其他信息,请参阅以下页面:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2014-10-10
    相关资源
    最近更新 更多