2015年11月23日 星期一

[習題] FindControl 簡單練習--GridView + CheckBox,點選多列資料(複選刪除)#3 List或陣列

之前的範例,使用字串、文字來記錄將刪除的文章ID
後續會有很多小缺失,而且要防呆也麻煩 (如下面 YouTube影片)

[習題] FindControl 簡單練習--GridView + CheckBox,點選多列資料(複選刪除)#1 簡單版

[習題] FindControl 簡單練習--GridView + CheckBox,點選多列資料(複選刪除) #2 - 分頁&範例下載


原先的範例,在書本上集(ASP.NET專題實務(I) / 松崗出版)第十章就有解說
YouTube影片教學  https://youtu.be/LnYXiyQghKs



改用傳統陣列寫,也有點礙手礙腳。後來改用 List處理。


Q:  在 GridView裡面,每一列資料都加上 CheckBox,
     被勾選的那一列,就要刪除之。 

 ======================================================================
首先,我們先把 GridView的某一欄位,修改成「樣版」。
就可以在裡面,手動加入一個 CheckBox控制項。  
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {   // 第一次執行。
            List myArray = new List();    // 初始化。建立一個新的 List
            Session["myArray"] = myArray;
        }
    } 
 
    protected void Button1_Click(object sender, EventArgs e)
    {   //== 重複的、大量的程式,就抽離出去,獨自成為一個函數、副程式。
        Checkbox_Process();
        // 如果您希望按下 "分頁" 就自動記錄勾選的那幾筆,請把這段程式寫在底下的GridView "分頁"事件即可。
    }
 
 
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        //    //GridView1.PageIndex = e.NewPageIndex;
        //    ////== 在此不用作 DataBinding。
        //    ////      因為HTML畫面裡面, GridView已經有設定 DataSourceID。
        //    ////      這個事件不寫也行。因為GridView + SqlDataSource精靈會處理分頁。
    }
 
 
    //**** 請看上集,第十一章 *******************************************
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {   
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            CheckBox myCheckbox = (CheckBox)e.Row.FindControl("CheckBox1");
            Label myID = (Label)e.Row.FindControl("Label1");
 
            //*** 方法二 ****************************************************************
            //*** 把字串(A1,A2,A3.....)轉成陣列會更好,就可以不用在數字前面加上「A」了!
            //*** http://msdn.microsoft.com/zh-tw/library/b873y76a(v=vs.110).aspx
 
            List myArray = (List)Session["myArray"];
            if (myArray.IndexOf(myID.Text) >= 0)   //-- 已經有資料在內
            {    //-- 檢查一下,如果文章編號已經記錄在裡面了,那麼 CheckBox就要被勾選。
                myCheckbox.Checked = true;
            }
            else    {
                myCheckbox.Checked = false;
            }
        }
    }
 
 
    protected void Checkbox_Process()
    {
        List myArray = (List)Session["myArray"];
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox myCheckbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            Label myID = (Label)GridView1.Rows[i].FindControl("Label1");
 
            if (myCheckbox.Checked == true)
            {   //====================
                //==  被點選的某一筆資料。 ==
                //==================== 
                //註解:VB語法的 Instr(),在C#裡面改為 .IndexOf("字串", 0)
                //    找不到的話, 會傳回「-1」。
                //    找到的話,回傳一個Integer數字(從零算起)。表示在字串裡面第幾個字,符合條件。
                //  請看 http://www.dotblogs.com.tw/mis2000lab/archive/2009/01/14/instr_function_090114.aspx
                
                if (myArray.IndexOf(myID.Text) == -1)
                {   //-- 檢查一下,如果相同的文章編號已經記錄在 List了,就不要重複記憶!
                    myArray.Add(myID.Text);
                }
            }
            else
            {   //== 「沒有」被點選的某一筆資料。 必須從 List裡面刪除 ==
                if (myArray.IndexOf(myID.Text) >= 0)  //--已經有資料在內              
                {
                    myArray.Remove(myID.Text);
                }
            }   // if -- End
        }  // for loop -- End
  
        if (myArray.Count == 0)  {   // List沒有 Length,只能用 Count
            Label2.Text = "您尚未點選任何一筆資料(沒有刪除任何一筆)";
        }
        else    {
            // Debug用的,把資料列在畫面上。
            Label2.Text = "";
            foreach (string str in myArray)     {
                Label2.Text += str + ",";
            }
            //== 您可以使用這些文章的ID來進行SQL指令「刪除」的動作 ==
        }
    }

您也可以參閱 topcat在藍色小舖的解答,位於 13F

沒有留言: