摘要:[習題] FindControl 簡單練習--GridView + CheckBox,點選多列資料(複選刪除)#3 List或陣列
之前的範例,使用字串、文字來記錄將刪除的文章ID
後續會有很多小缺失,而且要防呆也麻煩 (如下面 YouTube影片)
原先的範例,在書本上集(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<string> myArray = new List<string>(); // 初始化。建立一個新的 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<string> myArray = (List<string>)Session["myArray"];
if (myArray.IndexOf(myID.Text) >= 0) //-- 已經有資料在內
{ //-- 檢查一下,如果文章編號已經記錄在裡面了,那麼 CheckBox就要被勾選。
myCheckbox.Checked = true;
}
else {
myCheckbox.Checked = false;
}
}
}
protected void Checkbox_Process()
{
List<string> myArray = (List<string>)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
http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD201510271612260I7.html
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約75~88hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
ASP.NET MVC線上課程 第一天 免費看 (5.5小時)
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.台灣 或 school (at) mis2000lab.net
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
................ facebook社團 https://www.facebook.com/mis2000lab ......................
................ YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
事先錄製好的影片,並非上課時側錄! 觀看影片時,有如我「一對一」跟您面對面講課。

累積時數約 95小時...... 第一天(5.5小時)完整內容,"免費"讓您評估
