在aspx.cs文件变量的作用域(Scope of variables in aspx.cs fil

2019-07-30 17:23发布

我写下面的代码:

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
        }
    }
}

在这里我的数据集的变量是全球性的,但是当我点击按钮2,它没有数据发送到输出继电器XML文件。 你能告诉我为什么吗? 或者有什么改变,我将让执行这个?

谢谢

Answer 1:

你需要看看Asp.net页面的生命周期 ,在你的代码,当您在按钮点击页面被破坏并重新创建再次和整个生命周期之后,并在这个过程中你的DS(数据集)被重建过,因此输出XML不具有任何数据。 为了维护您的数据集的状态来看看在Asp.net状态管理



Answer 2:

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

移动数据集的初始化private DataSet dataset1= new DataSet();

到负荷

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

显然,不`吨忘记单击Button1单击Button2的前:)



Answer 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事件处理的数据集。

如果你不希望每次都产生这个数据集,你必须要么保持会话ViewState中缓存这个变量

更新1

第三个也是最后一个选项可以使这个数据集变量作为类级别的变量,即静态的,这将是所有可用的时间



Answer 4:

你不会在button2_click数据集中获取数据,因为的button1_Click和button2_clicks是完全不同的请求到服务器。 和asp.net不会持续存储在请求之间的变量数据。 如果您需要保留的数据,你应该使用asp.net提供,如会话或视图状态或高速缓存任何状态管理技术。



Answer 5:

我建议请使用ViewStateSession会消耗大量的服务器内存,虽然你可以使用其中任何一个解决的目的。

我不认为BUTTON1的事件处理程序从创建DS除了做任何事情。 所以,只有一个事件处理程序将解决这个目的。

访问这两个事件处理程序DS,而不会丢失数据的另一种方式是宣布DS为static 。 但这种机制不适合此方案。



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


文章来源: Scope of variables in aspx.cs file