2012年8月23日 星期四

Datatable一次刪除多列

這篇著重在Datatable的操作,要一次刪除多筆記錄,但不涉及伺服器端操作
要不添三刪五的,伺服器又不是整天閒著沒事專門架設來給人瞎整...

這次一樣是有完整的前後台程式碼,直接貼上即可使用
前台程式碼,要貼在form標籤裡面喔

  <div id="NewRecord">
    <table border=1 id="NewRecordTable">
    <tr><td>分類名稱</td><td>
        <asp:TextBox ID="tbxName" runat="server"></asp:TextBox></td>
    </tr>
    <tr><td>代碼</td><td><asp:TextBox ID="tbxCode" runat="server"></asp:TextBox></td></tr>
    </table>
       <asp:Button ID="btnNew" runat="server" Text="新增" onclick="btnNew_Click" />
       <asp:Button ID="btnDel" runat="server" Text="刪除" onclick="btnDel_Click" />
    </div>
    <hr />
    <div>
    <asp:GridView ID="gvData" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField HeaderText="刪除">
                    <ItemTemplate>
                        <asp:CheckBox ID="cbxDel" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="cName" HeaderText="分類名稱" />
                <asp:BoundField DataField="cCode" HeaderText="代碼" />
            </Columns>
        </asp:GridView>
    </div>    


這是後台程式碼,記得蓋掉Page_Load


 //將Table狀態回存Session
    DataTable DS {
        get { return (DataTable)Session["DS"]; }
        set { Session["DS"] = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) {
            BindData();
        }
    }
    private void BindData() {
        //先判斷Session裡面有沒有東西,否則反覆存取會錯亂
        if (Session["DS"] == null)
        {
            Session["DS"] = TmpData();
        }
        gvData.DataSource = DS;
        gvData.DataBind();
    }
    //塞假資料
    private DataTable TmpData() {
        DataTable dtr = new DataTable();
        dtr.Columns.Add("cName");
        dtr.Columns.Add("cCode");
        dtr.Rows.Add(new object[] { "Aries", "A1" });
        dtr.Rows.Add(new object[] { "Gimini", "A2" });
        dtr.Rows.Add(new object[] { "Leon", "A3" });
        dtr.Rows.Add(new object[] { "Libra", "A4" });

        return dtr;
    }

   //新增資料
    protected void btnNew_Click(object sender, EventArgs e) {
        DataTable dt = DS;
        dt.Rows.Add(tbxName.Text.Trim(), tbxCode.Text.Trim());
        Session["DS"] = dt;

        gvData.DataSource = dt;
        gvData.DataBind();
    }
    protected void btnDel_Click(object sender, EventArgs e) {
        DataTable dt = DS;

        for (int i = dt.Rows.Count - 1; i >= 0; i--) {
            CheckBox cb = (CheckBox)gvData.Rows[i].FindControl("cbxDel"); 
            if (cb.Checked) 
            {
                dt.Rows.RemoveAt(i);
            }
        }
        dt.AcceptChanges();

        Session["DS"] = dt;
        gvData.DataSource = DS;
        gvData.DataBind();

    }


重點在紅色的部分,每次刪除後Rows.Count數字會一直變小
所以要逆向跑迴圈才不會發生錯誤....

舉例來說一開始資料表有5筆,我要刪掉1跟5兩筆
第一筆刪除後,Rows.Count會變成4,這時候第5筆就會因為大於Rows.Count刪不掉
逆向跑迴圈會先刪掉第5筆,這時候Rows.Count一樣變4,但接下來要刪除的都不會大於Rows.Count,這就是要逆向刪除的原因

另外在DataTable刪除的方法上有兩種

Delete的使用是 dt.Rows[i].Delete();
Remove的使用是dt.Rows.Remove(dt.Rows[i]);

最後都要dt.AcceptChanges()一下

1 則留言: