• [习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组


    [习题] 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<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

  • 相关阅读:
    Photoshop做32位带Alpha通道的bmp图片
    PNG怎么转换成32位的BMP保持透明
    解决WIN32窗口不响应WM_LBUTTONDBLCLK消息
    Windows键盘消息处理
    对象与控件如何建立关联
    DrawItem
    在C语言中除法运算为什么没有小数部分?
    使用GDI+进行图片处理时要注意的问题
    MFC中无标题栏窗口的移动
    MFC带标题栏的窗口和不带标题栏的窗口最大化
  • 原文地址:https://www.cnblogs.com/mis2000lab/p/GridView_CheckBox_List_Array_MultiSelect.html
Copyright © 2020-2023  润新知