要不添三刪五的,伺服器又不是整天閒著沒事專門架設來給人瞎整...
這次一樣是有完整的前後台程式碼,直接貼上即可使用
前台程式碼,要貼在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]);
所以要逆向跑迴圈才不會發生錯誤....
舉例來說一開始資料表有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()一下
太感謝,這個問題終於有解了
回覆刪除