aspx.cs文件中的变量范围

时间:2012-08-01 05:35:48

标签: c# asp.net webforms scope

我正在编写以下代码:

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文件发送任何数据。你能告诉我为什么吗?或者我应该做些什么修改?

由于

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

移动数据集private DataSet dataset1= new DataSet();

的初始化

加载

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

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

答案 2 :(得分:0)

是的,您的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事件处理程序中生成数据集。

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

更新1

第三个也是最后一个选项可以是将这个数据集变量作为类级别变量,即静态,并且它将一直可用

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

我不认为button1的事件处理程序除了创建ds之外还做了什么。 因此,只有一个事件处理程序可以解决目的。

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

答案 5 :(得分:0)

 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");
    }