Repeater 是 ASP.NET 中最輕量、彈性最高的資料繫結控制項,不輸出預設 HTML 結構,完全由開發者透過模板掌控呈現。本文將示範完整的 CRUD 操作:資料綁定、刪除、編輯導向、啟用/停用狀態切換。
private void BindStudent()
{
string connStr = ConfigurationManager.ConnectionStrings["stucnn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM student", conn))
{
DataSet ds = new DataSet();
da.Fill(ds);
Repeater1.DataSource = ds;
Repeater1.DataBind();
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) BindStudent();
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["stucnn"].ConnectionString;
if (e.CommandName == "Delete")
{
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "DELETE FROM student WHERE sid = @sid";
cmd.Parameters.AddWithValue("@sid", e.CommandArgument);
cmd.ExecuteNonQuery();
}
BindStudent(); // 重新綁定更新畫面
}
else if (e.CommandName == "Edit")
{
// 導向編輯頁面,攜帶主鍵
Server.Transfer($"Edit.aspx?sid={e.CommandArgument}");
}
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "true" || e.CommandName == "false")
{
string connStr = ConfigurationManager.ConnectionStrings["stucnn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "UPDATE student SET status = @status WHERE sid = @sid";
cmd.Parameters.AddWithValue("@status", e.CommandName);
cmd.Parameters.AddWithValue("@sid", e.CommandArgument);
cmd.ExecuteNonQuery();
}
BindStudent();
}
}
<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
<HeaderTemplate>
<table>
<tr>
<td style="width:100px">編號</td>
<td style="width:100px">姓名</td>
<td style="width:100px">圖片</td>
<td></td><td></td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("sid") %></td>
<td><%# Eval("sname") %></td>
<td><img width="60" height="60" src='<%# "images/" + Eval("photo") %>' /></td>
<td><asp:LinkButton ID="btnDelete" runat="server" Text="刪除" CommandName="Delete" CommandArgument='<%# Eval("sid") %>'></asp:LinkButton></td>
<td><asp:LinkButton ID="btnEdit" runat="server" Text="編輯" CommandName="Edit" CommandArgument='<%# Eval("sid") %>'></asp:LinkButton></td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr style="background-color:#f2f2f2">
<td><%# Eval("sid") %></td>
<td><%# Eval("sname") %></td>
<td><img width="60" height="60" src='<%# "images/" + Eval("photo") %>' /></td>
<td><asp:LinkButton ID="btnDelete" runat="server" Text="刪除" CommandName="Delete" CommandArgument='<%# Eval("sid") %>'></asp:LinkButton></td>
<td><asp:LinkButton ID="btnEdit" runat="server" Text="編輯" CommandName="Edit" CommandArgument='<%# Eval("sid") %>'></asp:LinkButton></td>
</tr>
</AlternatingItemTemplate>
<SeparatorTemplate><tr><td colspan="5"><hr /></td></tr></SeparatorTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
<HeaderTemplate><table><tr><th>編號</th><th>姓名</th><th>狀態</th><th></th></tr></HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("SID") %></td>
<td><%# Eval("sname") %></td>
<td><%# Convert.ToBoolean(Eval("status")) ? "啟用" : "禁用" %></td>
<td>
<asp:LinkButton ID="btnSetStatus" runat="server"
CommandArgument='<%# Eval("sid") %>'
Text='<%# Convert.ToBoolean(Eval("status")) ? "禁用" : "啟用" %>'
CommandName='<%# Convert.ToBoolean(Eval("status")) ? "false" : "true" %>'>
</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
CommandArgument 綁定 Eval("sid"),後端透過 e.CommandArgument 取得。ItemCommand 事件依 CommandName 分流處理 Delete、Edit、狀態切換等邏輯。SqlParameter,防止注入攻擊。Server.Transfer 保持同一 Request,避免網址列暴露 QueryString (視需求選擇)。OnItemDataBound 事件,依權限動態顯示/隱藏按鈕。PagedDataSource 實作分頁。confirm() 或 Bootstrap Modal 二次確認。