ASP.NET控件第三篇----Repeater
首先是HTML代码
为控件绑定数据的方法 Text='<%#Eval("")%>'
<asp:Repeater ID="rpStudent" runat="server" OnItemCommand="rpStudento_ItemCommand">
<HeaderTemplate><%--存放表头--%>
<table style="width: 100%; white-space: nowrap">
</HeaderTemplate>
<ItemTemplate><%--存放需要重复生成的行,即需要重复生成的行的一个模板,只能包含一对<tr></tr>--%>
<tr>
<td style="width: 130px">
<asp:Label ID="labStudentName" runat="server" Text="学生姓名"></asp:Label></td>
<td>
<asp:TextBox ID="tbStudentName" runat="server" Text='<%#Eval("StudentName")%>'></asp:TextBox>
</td>
<td>
<asp:Label ID="labStudentNo" runat="server" Text="学生学号"></asp:Label></td>
<td>
<asp:TextBox ID="tbStudentNo" runat="server" Text='<%#Eval("StudentNo")%>'></asp:TextBox></td>
<td>
<asp:LinkButton ID="lnkDel" runat="server" Text="删除" CommandName="Delete"></asp:LinkButton>
<asp:HiddenField ID="hidStudentID" runat="server" Value='<%#Eval("StudentID") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate><%--存放表格其他的部分--%>
<tr>
<td colspan="4">
<asp:LinkButton ID="lnkNewStudentInfo" runat="server" Text="新增" commandName="New"></asp:LinkButton>
</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
<asp:Button ID="btnSaveCustInfo" runat="server" OnClick="btnSaveCustInfo_Click" Text="保存" />
C#的代码,第一次加载页面的时候绑定数据
protected void Page_Load(object sender, EventArgs e)
{
//第一次加载绑定数据,一定要加(!IsPostBack),否则PostBack会报错
if (!IsPostBack)
{
InitData();
DataBinds();
}
}
protected void InitData()//生成一个空的DataTable
{
try
{
DataTable dt = new DataTable();
dt.Columns.Add("StudentID", typeof(string));
dt.Columns.Add("StudentName", typeof(string));
dt.Columns.Add("StudentNo", typeof(string));
for (int i = 0; i < 1; i++)
{
DataRow dr = dt.NewRow();
dr["StudentID"] = "";
dr["StudentName"] = "";
dr["StudentNo"] = "";
dt.Rows.Add(dr);
}
ViewState.Add("Data", dt);
}
catch (Exception ex)
{
throw ex;
}
}
protected void DataBinds()//绑定数据
{
rpStudent.DataSource = ViewState["Data"] as DataTable;
rpStudent.DataBind();
}
Repeater中的所有控件操作可以放在 OnItemCommand中,在控件中增加 CommandName属性
自定义一个名字,以便执行OnItemCommand中对应的操作
在本例子中,Repeater有两个LinkButton分别执行新增和删除的操作
对应的CommandName分别为New和Delete
OnItemCommand的C#代码如下
protected void rpStudento_ItemCommand(object source, RepeaterCommandEventArgs e)
{
try
{
if (e.CommandName == "Delete")//删除学生信息
{
string ls_StudentID = (e.Item.FindControl("hidStudentID") as HiddenField).Value;
//判断Item的数目,大于一条,直接删除数据
if (rpStudent.Items.Count > 1)
{
DataTable dt = CopyFormData();//复制数据
dt.Rows.RemoveAt(e.Item.ItemIndex);//移除Item
ViewState.Add("Data", dt);
DataBinds();//重新绑定数据
}
//Item数目等于1,删除数据之后新增一条空的记录
else
{
DataTable dt = CopyFormData();//复制数据
dt.Rows.RemoveAt(e.Item.ItemIndex);//移除Item
DataRow dr = dt.NewRow();//新增空行
dt.Rows.Add(dr);
ViewState.Add("Data", dt);
DataBinds();//重新绑定数据
}
}
}
catch (Exception ex)
{
throw ex;
}
try
{
if (e.CommandName == "New")//新增学生信息
{
DataTable dt = CopyFormData();//复制数据
DataRow dr = dt.NewRow();//新增一行
dt.Rows.Add(dr);//将新增的行加入Datatable中
ViewState.Add("Data", dt);
DataBinds();//重新绑定数据
}
}
catch (Exception ex)
{
throw ex;
}
}
protected DataTable CopyFormData()//复制数据
{
DataTable dt = (ViewState["Data"] as DataTable).Clone();
try
{
foreach (RepeaterItem ri in rpStudent.Items)
{
DataRow dr = dt.NewRow();
dr["StudentID"] = (ri.FindControl("hidStudentID") as HiddenField).Value;
dr["StudentName"] = (ri.FindControl("tbStudentName") as TextBox).Text;
dr["StudentNo"] = (ri.FindControl("tbStudentNo") as TextBox).Text;
dt.Rows.Add(dr);
}
}
catch (Exception ex)
{
throw ex;
}
return dt;
}
获取Repeater数据的方法
protected void btnSaveCustInfo_Click(object sender, EventArgs e)
{
try
{
List<string[]> list = new List<string[]>();
list.Clear();
for (int i = 0; i < rpStudent.Items.Count; i++)
{
string ls_StudentName = (rpStudent.Items[i].FindControl("tbStudentName") as TextBox).Text;
string ls_StudentNo = (rpStudent.Items[i].FindControl("tbStudentNo") as TextBox).Text;
string ls_StudentID = (rpStudent.Items[i].FindControl("hidStudentID") as HiddenField).Value;
string info = ls_StudentName + "," + ls_StudentNo + "," + ls_StudentID;
string[] info_Array = info.Split(',');
list.Add(info_Array);
}
}
catch (Exception ex)
{
throw ex;
}
}