大家可能都對datagrid比較熟悉,但是如果在數據量大的時候,我們就得考慮使用repeater作為我們的數據綁定控件了。Repeater控件與DataGrid (以及DataList)控件的主要區別是在於如何處理HTML。ASP.NET建立HTML代碼以顯示DataGrid控件,但Repeater允許開發人員決定如何顯示數據。所以,你可以選擇將數據顯示在一個HTML表格中或者一個順序列表中。這主要取決於你的選擇,但你必須將正確的HTML插入到 ASP.NET頁面中。
模板與DataList一樣,Repeater控件只支持模板。以下的模板可供選擇:
AlternatingItemTemplate: 指定如何顯示每一其它選項。
ItemTemplate: 指定如何顯示選項。(AlternatingItemTemplate可以覆蓋這一模板。)
HeaderTemplate: 建立如何顯示標題。
FooterTemplate: 建立如何顯示頁腳。
SeparatorTemplate: 指定如何顯示不同選項之間的分隔符。
你可以使用這些模板來顯示你希望的數據。唯一具有強制性的模板是ItemTemplate,所有其它的模板都是具有選擇性的。
對於處理一個數據源,Repeater控件具有與DataGrid與DataList相同的屬性:
DataMember:獲得或者設置與 Repeater 控件綁定的相應DataSource屬性的表格。
DataSource:獲得或者設置為 Repeater 顯示提供數據的數據源。
除此之外,還有一個Items屬性,你可以通過這一屬性編程訪問Repeater數據中單一選項。它返回一個RepeaterItemCollection對象,為一組RepeaterItem對象的集合,代表 Repeater 數據的每一行。
ASP.NET Web數據控件還有其它一個共性:它們都使用DataBind方法來生成用戶界面。調用這一方法可以返回並顯示數據(假設DataSource和 DataMember屬性設置正確)。在查看DataBind方法之前,我們先看看如何在一個Web頁面中使用一個Repeater控件。
使用Repeater控件
使用Repeater控件的第一步驟是決定我們將要使用的數據源和字段。例如,我們將要使用SQL Server Northwind數據庫中的Employees列表。Web頁面將顯示職工的完整名字,地址,以及電話號碼。HTML將使用DIV標記,用 Repeater 模板來分隔內容。下面是 Web 頁面的 HTML 內容:
前台代碼
代碼如下<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate><table cellpadding="0" cellspacing="0" border="1" align="center" class="auto-style1">
<tr align="left">
<th>編號</th>
<th>姓名</th>
<th>年齡</th>
<th>班級</th>
<th>零花</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr >
<td><%#Eval("id")%></td>
<td><%#Eval("name")%></td>
<td><%#Eval("age")%></td>
<td><%#Eval("classid")%></td>
<td><%#Eval("salary")%></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
後台代碼
代碼如下 string sql = string.Format("select * from person");AspNetpager的使用方法:
首先注冊<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
前台:
代碼如下 <webdiyer:AspNetPager ID="AspNetPager1" runat="server" CustomInfoHTML="第%CurrentPageIndex%頁,共%PageCount%頁,每頁%PageSize%條"後台:
代碼如下 private void AddPages(Repeater rpt,Wuqi.Webdiyer.AspNetPager anp,DataTable dt)例子
repeater控件動態添加、刪除一行
代碼如下<script type="text/javascript">
var txtEquipmentIdsIDArray = new Array();
function OpenWindow(clientId, TypeId, ReqNum) {
var url = "../EquipmentIssue/EquipmentRequestIssue.aspx?TypeId=" + TypeId + "&ReqNum=" + ReqNum;
var widths = 600;
var heigths = 450;
var winPar = window.showModalDialog(url, window, 'dialogWidth=' + widths + 'px;dialogHeight=' + heigths + 'px;status=no;center=yes;scroll=no;help:No;');
if (winPar != undefined) {
var txtEquipmentIds = document.getElementById(clientId);
txtEquipmentIds.value = winPar;
// //審批用戶控件中保存發放的EquipmentId
// var IsExistEquipmentIdsID = false;
// for (var i = 0; i < txtEquipmentIdsIDArray.length; i++) {
// if (txtEquipmentIdsIDArray[i] == clientId) {
// IsExistEquipmentIdsID = true;
// }
// }
// if (IsExistEquipmentIdsID == false) {
// txtEquipmentIdsIDArray.push(clientId);
// }
// var tempEquipmentId = "";
// for (var i = 0; i < txtEquipmentIdsIDArray.length; i++) {
// tempEquipmentId = tempEquipmentId + document.getElementById(txtEquipmentIdsIDArray[i]).value;
// var hiddenEquipmentIds = document.getElementById("UC_ApprovalAction1_hfEquipmentIds");
// hiddenEquipmentIds.value = tempEquipmentId;
// }
// //alert(hiddenEquipmentIds.value);
}
var tempReturnValue = "";
var tb_Request = document.getElementById("tb_Request");
var tr = tb_Request.getElementsByTagName("tr");
for (var i = 0; i < tr.length; i++) {
if (tr[i].id != "") {
var span_EquRequestItemId = tr[i].getElementsByTagName("span"); //獲取申請明細的IDEquRequestItemId
var select_ddlStation; //獲取使用工位StationId
var option = tr[i].getElementsByTagName("select")[1].getElementsByTagName("option");
for (var j = 0; j < option.length; j++) {
if (option[j].selected)
{
select_ddlStation = option[j]
}
}
var textarea_EquipmentIds = tr[i].getElementsByTagName("textarea"); //獲取發放的資產號EquipmentNo
tempReturnValue = tempReturnValue + span_EquRequestItemId[0].innerText + ":" + select_ddlStation.value + ":" + textarea_EquipmentIds[0].innerText + "|";
}
}
var hiddenEquipmentIds = document.getElementById("UC_ApprovalAction1_hfEquipmentIds");
hiddenEquipmentIds.value = tempReturnValue;
//alert(hiddenEquipmentIds.value);
}
</script>
Repeater:
代碼如下<div id="div_Repeater">
<asp:HiddenField ID="hfRptColumns" runat="server" Value="Guid,EquRequestItemId,EquipmentType,Station,EquipmentNum,EquipmentIds" />
<table id="tb_Request" cellpadding="1" cellspacing="0" width="100%" style="background-color: #DFE8F6; font-size:12px; padding:10px;">
<thead>
<tr>
<th>序號</th>
<th>明細編號</th>
<th>
資產類型
</th>
<th>
使用工位
</th>
<th>
申請數量
</th>
<th>
發放的資產號<font color="red">(資產管理員填寫)</font>
</th>
</tr>
</thead>
<tbody>
<asp:Repeater ID="rptRequest" runat="server" onitemcommand="rptRequest_ItemCommand"
onitemdatabound="rptRequest_ItemDataBound">
<ItemTemplate>
<tr id="tr_Request">
<td>
<%# Container.ItemIndex+1 %>
<asp:Label ID="lblGuid" runat="server" Text='<%#Eval("Guid") %>' Visible="false"></asp:Label>
</td>
<td><asp:Label ID="lblEquRequestItemId" runat="server" Text='<%#Eval("EquRequestItemId") %>'></asp:Label></td>
<td>
<asp:DropDownList ID="ddlEquipmentType" runat="server"></asp:DropDownList>
<asp:Label ID="lblEquipmentType" runat="server" Text='<%#Eval("EquipmentType") %>' Visible="false"></asp:Label>
</td>
<td>
<asp:DropDownList ID="ddlStation" runat="server"></asp:DropDownList>
<asp:Label ID="lblStation" runat="server" Text='<%#Eval("Station") %>' Visible="false"></asp:Label>
</td>
<td><asp:TextBox ID="txtReqEquipmentNum" runat="server" Text='<%#Eval("EquipmentNum") %>'></asp:TextBox></td>
<td><asp:TextBox ID="txtEquipmentIds" runat="server" Text='<%#Eval("EquipmentIds") %>' TextMode="MultiLine"></asp:TextBox></td>
<td><asp:Button ID="btnAddRow" runat="server" Text="新增一行" CommandName="add" />
<asp:Button ID="btnDeleteRow" runat="server" Text="刪除本行" CommandName="delete" /></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</tbody>
</table>
</div>
後台:
代碼如下/// <summary>
/// 綁定repeater的數據源
/// </summary>
private void RepeaterBindData()
{
DataTable dt = DefineDataTableSchema(hfRptColumns.Value);
if (Request["BusinessNo"] == null)
{
LoadData(dt);
}
else
{
LoadData(Request["BusinessNo"].ToString(), dt);
}
rptRequest.DataSource = dt;
rptRequest.DataBind();
}
private void LoadData(string businessNo, DataTable dt)
{
string strSql = "select * from EMS_EquipmentRequestItem where BussinessNo = '"+ businessNo +"'";
DataTable dt_EquipmentRequestItem = DBUtility.DbHelperSQL.Query(strSql).Tables[0];
//for (int i = 0; i < dt_EquipmentRequestItem.Rows.Count; i++)
foreach (DataRow dr in dt_EquipmentRequestItem.Rows)
{
DataRow row = dt.NewRow();
row["Guid"] = Guid.NewGuid();
row["EquRequestItemId"] = dr["EquRequestItemId"].ToString();
row["EquipmentType"] = dr["TypeId"].ToString();
row["Station"] = dr["StationId"].ToString();
row["EquipmentNum"] = dr["EquipmentNum"].ToString();
row["EquipmentIds"] = dr["EquipmentIds"].ToString();
dt.Rows.Add(row);
}
}
/// <summary>
/// repeater數據默認加載
/// </summary>
/// <param name="dt"></param>
private void LoadData(DataTable dt)
{
//默認顯示1行
for (int i = 0; i < 1; i++)
{
DataRow row = dt.NewRow();
dt.Rows.Add(row);
}
//為第一行加載一些數據
DataRow row0 = dt.Rows[0];
row0["Guid"] = Guid.NewGuid();
row0["EquRequestItemId"] = "";
row0["EquipmentType"] = "";
row0["Station"] = "";
row0["EquipmentNum"] = "1";//默認初始為1
row0["EquipmentIds"] = "";
}
/// <summary>
/// 根據repeater相對應的列名,定義數據源datatable的schema
/// </summary>
/// <param name="columns">列名</param>
/// <returns></returns>
public DataTable DefineDataTableSchema(string columns)
{
DataTable dt = new DataTable();
string[] columnsAry = columns.Split(',');
foreach (string str in columnsAry)
{
dt.Columns.Add(str);
}
return dt;
}
protected void rptRequest_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "add")
{
System.Web.UI.WebControls.Label lblGuid = (System.Web.UI.WebControls.Label)e.Item.FindControl("lblGuid");
//首先,恢復數據源
DataTable dt = DefineDataTableSchema(hfRptColumns.Value);
foreach (RepeaterItem item in rptRequest.Items)
{
DataRow newRow = dt.NewRow();
newRow["Guid"] = ((System.Web.UI.WebControls.Label)item.FindControl("lblGuid")).Text;
newRow["EquRequestItemId"] = ((System.Web.UI.WebControls.Label)item.FindControl("lblEquRequestItemId")).Text;
newRow["EquipmentType"] = ((DropDownList)item.FindControl("ddlEquipmentType")).SelectedValue;
newRow["Station"] = ((DropDownList)item.FindControl("ddlStation")).SelectedValue;
newRow["EquipmentNum"] = ((TextBox)item.FindControl("txtReqEquipmentNum")).Text;
newRow["EquipmentIds"] = ((TextBox)item.FindControl("txtEquipmentIds")).Text;
dt.Rows.Add(newRow);
if (lblGuid.Text == ((System.Web.UI.WebControls.Label)item.FindControl("lblGuid")).Text)
{
//添加一行
DataRow row = dt.NewRow();
row["Guid"] = Guid.NewGuid();
row["EquipmentType"] = "";
row["Station"] = "";
row["EquipmentNum"] = "1";//默認初始為1
row["EquipmentIds"] = "";
dt.Rows.Add(row);
}
}
rptRequest.DataSource = dt;
rptRequest.DataBind();
}
else if (e.CommandName == "delete")
{
System.Web.UI.WebControls.Label lblGuid = (System.Web.UI.WebControls.Label)e.Item.FindControl("lblGuid");
//首先,恢復數據源
DataTable dt = DefineDataTableSchema(hfRptColumns.Value);
foreach (RepeaterItem item in rptRequest.Items)
{
if (lblGuid.Text != ((System.Web.UI.WebControls.Label)item.FindControl("lblGuid")).Text)
{
DataRow newRow = dt.NewRow();
newRow["Guid"] = ((System.Web.UI.WebControls.Label)item.FindControl("lblGuid")).Text;
newRow["EquRequestItemId"] = ((System.Web.UI.WebControls.Label)item.FindControl("lblEquRequestItemId")).Text;
newRow["EquipmentType"] = ((DropDownList)item.FindControl("ddlEquipmentType")).SelectedValue;
newRow["Station"] = ((DropDownList)item.FindControl("ddlStation")).SelectedValue;
newRow["EquipmentNum"] = ((TextBox)item.FindControl("txtReqEquipmentNum")).Text;
newRow["EquipmentIds"] = ((TextBox)item.FindControl("txtEquipmentIds")).Text;
dt.Rows.Add(newRow);
}
}
rptRequest.DataSource = dt;
rptRequest.DataBind();
}
}
protected void rptRequest_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DropDownList ddlEquipmentType_temp = e.Item.FindControl("ddlEquipmentType") as DropDownList;
string sqlstr = @"select distinct b.TypeId,b.EquipmentName + '_' + b.EquipmentType as 'EquipmentName_EquipmentType'
from EMS_EquipmentInfo a
join EMS_EquipmentType b on a.TypeId = b.TypeId and b.Status = '1'
order by EquipmentName_EquipmentType";
DataSet ds = DBUtility.DbHelperSQL.Query(sqlstr);
ddlEquipmentType_temp.DataTextField = "EquipmentName_EquipmentType";
ddlEquipmentType_temp.DataValueField = "TypeId";
ddlEquipmentType_temp.DataSource = ds;
ddlEquipmentType_temp.DataBind();
ddlEquipmentType_temp.SelectedValue = (e.Item.FindControl("lblEquipmentType") as System.Web.UI.WebControls.Label).Text;
DropDownList ddlStation_temp = e.Item.FindControl("ddlStation") as DropDownList;
string sqlstr2 = @"select NodeId,Line + '_' + StationName as 'Line_StationName' from V_Stations where status='1' order by Line_StationName";
DataSet ds2 = DBUtility.DbHelperSQL.Query(sqlstr2);
ddlStation_temp.DataTextField = "Line_StationName";
ddlStation_temp.DataValueField = "NodeId";
ddlStation_temp.DataSource = ds2;
ddlStation_temp.DataBind();
ddlStation_temp.SelectedValue = (e.Item.FindControl("lblStation") as System.Web.UI.WebControls.Label).Text;
TextBox txtEquIds = e.Item.FindControl("txtEquipmentIds") as TextBox;
txtEquIds.Attributes.Add("readonly", "true");
if (Request["BusinessNo"] != null)
{
(e.Item.FindControl("btnAddRow") as System.Web.UI.WebControls.Button).Visible = false;
(e.Item.FindControl("btnDeleteRow") as System.Web.UI.WebControls.Button).Visible = false;
string businessNo = Request["BusinessNo"].ToString();
bool IsApplyUser = Is_ApplyUser(Session["currentUserID"].ToString(), businessNo, "EMS_EquipmentRequest", "Requester");//是否為申請人本人
if (IsApplyUser == true)
{
string requestStatus = HttpUtility.UrlDecode(Request["RequestStatus"].ToString(), System.Text.Encoding.UTF8);//申請單的當前狀態
if (requestStatus == "草稿" || requestStatus == "退回")
{
(e.Item.FindControl("btnAddRow") as System.Web.UI.WebControls.Button).Visible = true;
(e.Item.FindControl("btnDeleteRow") as System.Web.UI.WebControls.Button).Visible = true;
}
}
else
{
bool IsCurrentAppprovaler = Is_CurrentAppprovaler(Session["currentUserID"].ToString(), businessNo);//是否為當前能做審批的人
if (IsCurrentAppprovaler == true)
{
string sql = " SELECT TOP 1 LayerName from EMS_Approvaler where BussinessNo='" + businessNo + "' "
+ " AND ApprovalStatus='N' ORDER BY AppSequence ";
DataTable dt = DBUtility.DbHelperSQL.Query(sql).Tables[0];
if (dt.Rows.Count != 0 && dt.Rows[0]["LayerName"].ToString() == "資產管理員")
{
string ReqNum = (e.Item.FindControl("txtReqEquipmentNum") as TextBox).Text.Trim();
txtEquIds.Attributes.Add("onclick", "OpenWindow('" + txtEquIds.ClientID + "','" + ddlEquipmentType_temp.SelectedValue + "','" + ReqNum + "')");
}
}
}
}
}
}