AJAXTOOLKIT用起來雖然很方便,但有時會出點問題,我遇到的問題就是使用了AJAXTOOLKIT裡面的控制項的頁面有時會出現重新整理失敗,或者該頁面內的GRIDVIEW裡面的按鈕點擊了有時沒反應,有時又有反應。在網上搜尋原來是AJAXTOOLKIT有BUG,有些人也或多或少遇到過一些類似的問題。因此我決定自己手寫AJAX代碼來實現頁面的無重新整理效果,這個過程中實現GridView無重新整理分頁是重點也很有代表性。下面給出實現過程。
後台代碼如下:
//要將GRIDVIEW轉換成HTML必須實重載下面VerifyRenderingInServerForm,方法體內為空白就行了。
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm (control);
}
protected void Page_Load(object sender, EventArgs e)
{
//首次訪問頁面顯示GRIDVIEW裡面的第一頁資料
if (!IsPostBack && Request.QueryString.Count== 0)
{
Session["page"] = "1";
MySqlConnection mcon = new MySqlConnection("server=localhost;database=test;uid=root;pwd=123");
mcon.Open();
MySqlCommand mcom = new MySqlCommand("select * from test limit " + 0 + "," + "100", mcon);
MySqlDataAdapter ma = new MySqlDataAdapter(mcom);
DataSet ds = new DataSet();
ma.Fill(ds);
GridView1.DataSource = ds.Tables[0];
DataBind();
mcon.Close();
mcon.Dispose();
mcom.Dispose();
ma.Dispose();
ds.Dispose();
}
//回傳的時候判斷是下一頁還是上一頁顯示新頁面的資料
else
{
if (Request.QueryString.Count > 0)
{
int page = Int32.Parse(Session["page"].ToString());
if (Request.QueryString["id"].Contains("next"))//"NEXT"表示下一頁
{
page++;
}
else if (Request.QueryString["id"].Contains("pre"))//“PRE”為上一頁
{
page--;
}
Session["page"] = page;
int beginNum=(page-1)*100;
MySqlConnection mcon = new MySqlConnection("server=localhost;database=test;uid=root;pwd=123");
mcon.Open();
MySqlCommand mcom = new MySqlCommand("select * from test limit "+beginNum+","+"100", mcon);
MySqlDataAdapter ma = new MySqlDataAdapter(mcom);
DataSet ds = new DataSet();
ma.Fill(ds);
GridView1.DataSource = ds.Tables[0];
DataBind();
//重點在下面,gridview通過STRINGWRITER將其html內容輸出到HTML輸出資料流裡去
System.IO.StringWriter stringWrite = new StringWriter();
System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter(stringWrite);
GridView1.RenderControl(writer);
String Result = stringWrite.ToString();
Response.Write(Result);
Response.End();//這個地方表示輸出的內容在這裡結束,將之前的內容發送到輸出資料流,因此輸出結果只有
//GRIDVIEW的HMTL,如果省略RESPONSE.END()。將輸出怎個頁面的HMTL代碼,在瀏覽器端還要重新截取
//GRIDVIEW 的HTML代碼,不方便,效率也不高,因為只需要更新GRIDVIEW的內容
DataBind();
mcon.Close();
mcon.Dispose();
mcom.Dispose();
ma.Dispose();
ds.Dispose();
}
}
}
瀏覽器代碼的ajax就很簡單了,將GRIDVIEW所在DIV的INNERHTML替換成傳回的的值就行了。