【问题标题】:Scope of variables in aspx.cs fileaspx.cs 文件中的变量范围
【发布时间】:2012-08-01 05:35:47
【问题描述】:

我正在编写以下代码:

namespace WebApplication5
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        private DataSet dataset1 = new DataSet();
        OleDbDataAdapter adapter;

        public DataSet ds
        {
            get { return dataset1; }
            set { dataset1 = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
            con.Open();
            adapter = new OleDbDataAdapter("Select * from User_Details",con);
            adapter.Fill(ds);
            GridView1.DataSource = ds;
            GridView1.DataBind();
           //  ds.WriteXml("C:\\MyUser_Details.xml"); If I do this here it writes data
            con.Close();
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            ds.WriteXml("C:\\MyUser_Details.xml");
            // no data in xml files, just root tags
        }
    }
}

这里我的 DataSet 变量是全局变量,但是当我单击 button2 时,它不会向 Ouput XML 文件发送任何数据。你能告诉我为什么吗?或者我应该进行哪些修改来执行此操作?

谢谢

【问题讨论】:

  • 没有所谓的“全局变量”;既不在 .NET/C# 中,也不在上面的代码示例中。你可以看看 MSDN 的ASP.NET Page Life Cycle Overview 文章。
  • 那么如何在 button2_Click 中访问我的数据集变量?
  • 您可以将数据存储在ViewStateSession 变量中。

标签: c# asp.net webforms scope


【解决方案1】:

您需要查看Asp.net page life cycle,在您的代码中,当您单击按钮时,页面会被销毁并重新创建,并遵循整个生命周期,在此过程中您的 ds(dataset) 也会重新创建,因此输出 xml 中没有任何数据。 要维护数据集的状态,请查看 State Management in Asp.net

【讨论】:

    【解决方案2】:

    这是因为您在回发期间创建了一个新数据集。

    移动Dataset的初始化private DataSet dataset1= new DataSet();

    进入负载

    protected void Page_Load(object sender, EventArgs e)
        {
             if(!Page.IsPostBack) { dataset1= new DataSet(); }
        }
    

    显然,在单击 Button2 之前不要忘记单击 Button1 :)

    【讨论】:

      【解决方案3】:

      是的,您的 ds 是全局的,但仅在网页的生命周期内是部分正确的。一旦页面被渲染并发送到客户端,您的页面就会被释放,因此变量也会随之释放。

      如果您希望 ds 在 button_click 事件中可用,请在其中填充 Page_Load 事件

      protected void Page_Load(object sender, EventArgs e)
      { 
                 OleDbConnection con = new OleDbConnection();
                 con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
                  con.Open();
                  adapter = new OleDbDataAdapter("Select * from User_Details",con);
                  adapter.Fill(ds);
                  con.close();
      }
      

      或者在您的 Button_Click 事件处理程序中生成数据集。

      如果您不想每次都生成此数据集,则必须将此变量保留在 SessionViewStateCache

      更新 1

      第三个也是最后一个选项可能是将此数据集变量设置为类级别变量,即静态,并且始终可用

      【讨论】:

      • 如果有人甚至可以谈论 C# 中的“全局变量”,那是由 this one 之类的东西完成的。
      【解决方案4】:

      您不会在 button2_click 的数据集中获得数据,因为 button1_click 和 button2_clicks 是对服务器的完全不同的请求。并且 asp.net 不会在请求之间持久化存储在变量中的数据。如果您需要持久化数据,您应该使用 asp.net 提供的任何状态管理技术,例如 Session 或 Viewstate 或 Caching。

      【讨论】:

        【解决方案5】:

        我建议请使用ViewState,因为Session 会消耗大量服务器内存,但您可以使用其中任何一个来解决此目的。

        我不认为 button1 的事件处理程序除了创建 ds 之外没有做任何事情。 所以只有一个事件处理程序可以解决这个问题。

        在两个事件处理程序中访问 ds 而不会丢失数据的另一种方法是将 ds 声明为 static。但这种机制并不适合这种情况。

        【讨论】:

        • 一个人应该从不在 ASP.NET 中使用static ..(有一些情况,但并不多)。
        • 是的,只有在需要时才应该使用。
        • 谢谢大家.. 我已经从 Session 成功了
        【解决方案6】:
         protected void Button1_Click(object sender, EventArgs e)
            {
                OleDbConnection con = new OleDbConnection();
                con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
                con.Open();
                adapter = new OleDbDataAdapter("Select * from User_Details",con);
                adapter.Fill(ds);
                GridView1.DataSource = ds;
                Session.Add("Dataset", ds); //Adding Session here
                GridView1.DataBind();
                con.Close();
            }
        
            protected void Button2_Click(object sender, EventArgs e)
            {
                DataSet ds = (DataSet)Session["Dataset"]; //Retrieving Value from session
                ds.WriteXml("C:\\MyUser_Details.xml");
            }
        

        【讨论】:

          猜你喜欢
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-21
          相关资源
          最近更新 更多