Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用户控件不保留私有值,返回在页面加载中设置的值_C#_Asp.net_User Controls - Fatal编程技术网

C# 用户控件不保留私有值,返回在页面加载中设置的值

C# 用户控件不保留私有值,返回在页面加载中设置的值,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有一个控件,定义如下: public partial class MyControl: System.Web.UI.UserControl { static int ControlID; static DataTable table; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { Control

我有一个控件,定义如下:

public partial class MyControl: System.Web.UI.UserControl
{
    static int ControlID;
    static DataTable table;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ControlID = 0;
            table= new DataTable();
        }
    }

    public void Save()
    {
        //ControlID is 0
        //table is empty DataTable
    }

    public void SetControlID(int id)
    {
        ControlID = id; //This DOES set id correctly

        SqlConnection conn = new SqlConnection(ConnectionString);
        SqlCommand command = new SqlCommand(SelectCommand, conn);
        command.Parameters.AddWithValue("@ControlID ", ControlID);
        SqlDataAdapter adapter = new SqlDataAdapter(command);
        adapter.Fill(table);

        //table is correctly filled with the correct data
    }
}
此控件添加到我的
aspx
页面,如下所示:

<uc:MyControl ID="myCont" runat="server" />
但是,页面上有一个“保存”按钮,可调用:

myCont.Save();
在该方法中,检查
ControlID
table
时,它们分别显示为0和空的
DataTable

为什么
ControlID
table
不保留在
SetControlID
方法中设置的值

编辑:删除2变量的静态属性没有任何区别


编辑#2:我只想指出,我在许多其他页面中使用过这种方法,一切都很好。在ASP.NET中,页面类的生命周期是处理请求的持续时间。也就是说,当请求进入时,页面的类被实例化,viewstate被反序列化为还原状态(如果是回发的话),一个事件被运行(比如按钮点击),响应被生成,然后对象被销毁。因此,任何未将其状态保存到viewstate(如int)中的成员都不会在激活过程中保留


另外,代码中的一个疑点是ControlID和tabe都声明为静态。这意味着这些值将在页面的所有调用者之间共享(并且每次请求新页面时,所有用户的表都将被覆盖)。这似乎不正确。

静态变量不是页面级(实例级)。。每次为任何其他用户加载页面时,您的静态
表将重置为空表。非常糟糕的主意。

为了保存数据,您必须使用


我写这封信是对你接受的答案的评论。但是,我没有足够的声望点来评论:-)


我接受了这一点,因为这是有效的。我不明白其他使用类似逻辑的页面在不使用ViewState的情况下是如何工作的。 当我说其他页面时,我指的是我构建的众多应用程序 以前,不仅仅是这个应用程序-另一灌木丛

我还建议在这种情况下使用viewstate,因为静态成员在所有web请求会话中共享,因此,您可能会看到不需要的行为

当您想知道为什么您的代码不起作用时,我将尝试给您一个理由:

请参阅ASP.NET页面生命周期。。。由此可以看出,用户控件的加载事件是在页面的加载事件之后处理的。因此,程序流程如下所示:

  • 在页面的
    Page\u Load
    中,您正在调用设置ControlID和table的
    myCont.SetControlID(1)
  • 然后发生用户控件的
    页面加载
    ,您正在重置/初始化控件ID和表
  • 稍后调用
    myCont.Save()
    ,您将看到ControlID和table的重置值

  • 希望这有帮助

    可能是因为静态属性。仔细检查一下。为什么这两个变量是静态的?它们被设置为静态的,因为我在其他页面上遇到了一些问题,变量根本没有初始化。将其设置为
    static
    有效,因此我继续练习。但是正如上面的编辑所说,删除
    static
    属性没有什么区别。我接受了这一点,因为它是有效的。我不明白其他使用类似逻辑的页面在不使用
    ViewState
    的情况下是如何工作的。当我说其他页面时,我指的是我以前构建的众多应用程序,不仅仅是这个应用程序。我理解
    静态
    变量的含义,但这不是问题所在。由于提供的代码,我接受了AVD在下面的帖子,但我对你的帖子投了赞成票。
    static
    不是问题所在,
    ViewState
    确实有效。我不明白的是,其他使用类似逻辑的页面在不使用
    ViewState
    的情况下是如何工作的。当我说其他页面时,我指的是我以前构建的众多应用程序,不仅仅是这个应用程序。你说
    myCont.Save()
    重置值,我可以看到这些值,我可以遵循这些逻辑,但是我在这里使用的相同逻辑已经在这个应用程序和其他应用程序的许多其他页面中使用,并且可以工作。我更想知道为什么其他的方法也能起作用,它们肯定也会受到影响?重置发生在用户控件的
    页面加载
    中,当调用用户控件的
    保存
    方法时,值已经被重置。在我有更多关于它们的信息之前,我无法评论为什么在其他地方使用相同的代码。可能是其他地方没有在用户控件的
    页面加载中重置ted值
    myCont.Save();
    
    public partial class MyControl: System.Web.UI.UserControl
    {
       public int ControlID
       {
         get
           {
            if(ViewState["ControlID"]==null)
               return 0;
            return int.Parse(ViewState["ControlID"].ToString()); 
           }
         set
          {
            ViewState["ControlID"] = value;
          }
       }
      ....
     }