之前的範例,使用字串、文字來記錄將刪除的文章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
沒有留言:
張貼留言