簡體   English   中英

aspx.cs文件中的變量范圍

[英]Scope of variables in aspx.cs file

我正在編寫以下代碼:

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文件。 你能告訴我為什么嗎? 或我應對此進行哪些修改?

謝謝

您需要查看Asp.net頁面的生命周期 ,在您單擊按鈕頁面的代碼中,該頁面被破壞並再次創建,並遵循整個生命周期,在此過程中,您還將重新創建ds(dataset),因此輸出xml中沒有任何數據。 要維護數據集的狀態,請查看Asp.net中的“狀態管理”

這是因為您在回發期間創建了新的數據集。

移動數據集private DataSet dataset1= new DataSet();的初始化private DataSet dataset1= new DataSet();

進入負載

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

很明顯,不要忘記在單擊Button2之前先單擊Button1 :)

是的,您部分正確地認為您的ds是Global,但僅在Web頁面的生命期內有效。 頁面呈現並發送給客戶端后,您的頁面將被處理,並因此帶有變量。

如果您希望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

第三個也是最后一個選擇是使此數據集變量成為類級別的變量,即靜態變量,並且始終可用

在button2_click中的數據集中不會獲得數據,因為button1_click和button2_clicks是對服務器的完全不同的請求。 而且,asp.net不會在請求之間持久存儲存儲在變量中的數據。 如果需要保留數據,則應使用asp.net提供的任何狀態管理技術,例如Session或Viewstate或Caching。

我建議您使用ViewState因為Session將消耗大量服務器內存,盡管您可以使用其中任何一個來解決目的。

我認為button1的事件處理程序除了創建ds之外沒有做任何其他事情。 因此,只有一個事件處理程序可以解決目的。

在兩個事件處理程序中訪問ds而不丟失數據的另一種方法是將ds聲明為static 但是這種機制不適合這種情況。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM