当我将一个项添加到对象的List c#asp.net时,对象的实例丢失了

时间:2017-10-24 23:36:05

标签: c# asp.net

我有一个对象,我在

后面的页面代码上初始化

以下是此对象类

的示例
public Class Thing
{
    List<OtherThing> _thisList;
    public List<OtherThing> ThisList
    {
        get { return _thisList; }
        set { _thisList= value; }
    }
    public Thing()
    {
        this._thisList=new List<OtherThing>();
    }
}

这是我的页面代码

public partial class form : System.Web.UI.Page
{
    private Thing theThing = new Thing();

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        OtherThing OT = new OtherThing(txtName.Text, Convert.toInt32(txtId.Text);
        TheThing.ThisList.Add(OT);
        this.gridview.DataSource=null;
        this.gridview.DataSource=TheThing.ThisList();
        this.gridview.DataBind();
    }
}

然而每次我添加一个元素时,gridview只会显示最新添加的元素,我尝试调试并发现当我第二次按下按钮时“TheThing”的列表显示为0

2 个答案:

答案 0 :(得分:1)

因为每次单击按钮,它都会执行此行

private Thing theThing = new Thing();

正在初始化Thing的新对象,并且在其构造函数中,您正在将ThisList属性初始化为空列表。

在该行中放置一个断点,你可以看到它

如果要在多个调用之间保留数据,则应将其保留在某处并从那里读取。您可以将其存储在会话状态,应用程序状态,内存缓存,磁盘中的文件或数据库中。

请记住, Http(并且应该是)无状态。理想情况下,每次调用您的页面都不知道之前的调用是做什么的。有趣的是,与这个原则相矛盾的是,Webforms使用一种名为ViewState的东西来保存调用之间的ui控件(下拉控件等)数据(回复点击按钮)。这更像是一种将有状态性(如Windows窗体应用程序)引入Web表单的黑客行为!

顺便说一下,你的班级可以简单地使用自动属性,因为它没有对setget操作做任何事情

public class Thing
{
    public List<OtherThing> ThisList { get; set; }
    public Thing()
    {
        this.ThisList = new List<OtherThing>();
    }
}

答案 1 :(得分:0)

这是因为:

您每次按钮添加时都声明python 3.6+ this.gridview.DataSource=null;

尝试将此内容放入clicked事件:

Form load

并在您的this.gridview.DataSource=null; 活动中:

button Click