所以我目前有一个aspx页面,显示任何一个工作人员的详细信息,页面设置主要是ASP标签。我有一个名为“getstaffdata”的子程序,它在加载时填充页面(通过子程序)。
我想将此转换为一个页面,一个接一个地显示一名工作人员或许多工作人员的详细信息。所以我想到了使用转发器控件,但我不知道如何转换页面。工作人员用户ID通过查询字符串传递,但我只是对如何为转发器控件执行数据源感到困惑。
任何输入都将不胜感激。
答案 0 :(得分:2)
基本概要:
1)在原始标记周围放置一个Repeater:
<asp:Repeater ID="myRepeater" runat="server">
<ItemTemplate>
[your original markup]
</ItemTemplate>
</asp:Repeater>
2)现在需要一个返回人员数据项集合的方法代替GetStaffData ...数组,ArrayList或List都可以工作。
3)将此集合绑定到Repeater数据源和数据绑定。简化形式:
myRepeater.DataSource = GetStaffData(Request.QueryString["staffids"]);
myRepeater.DataBind();
4)将控件现在绑定在转发器的ItemDataBound事件中的ItemTemplate中。需要记住的两件重要事情:现在必须使用FindControl获取控件的句柄,并且绑定页眉和页脚项时控件将不存在。
myRepater_ItemDataBound(...)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
Label myLabel = e.Item.FindControl("myLabel");
myLabel.Text = //whatever
}
}
答案 1 :(得分:1)
我在想你有:
E.g。 顶级中继器
ID |名称
[X] 1 |约翰·多伊
[] 2 |简平原
[X] 3 |玛丽相反的
[] 4 |詹姆斯布朗
[X]
是一个选中的复选框。带我回到ASCII艺术时代; - )
底部中继器
名称DOB地址电话
John Doe 24/12/1970 79a Dead Lane,Mort-on-Avon,Warwicks 01789 999 6669
Mary Contrary 5/3/1982 23 Contrary St,London 0207 1234 5678
您需要两个Sql查询或存储过程。您需要修改当前正在推动您的页面并创建或重新使用另一个页面的那个。
现有的查询类似于:
SELECT * FROM Staff WHERE StaffID = x
- x 可能是通过Querystring传递给页面的。
您需要修改此项以匹配多个员工IDS。我会建议传递一个简单的垃圾邮件列表的快速n脏方法。 '1,4,8'
和INNER JOIN
将您的Staff
表格添加到CSV的表格表格中。 SQL Server具有方便的dbo.Split
功能。大多数RDBMS都存在类似的事情。
您需要创建的那个将按字母顺序返回列表中的ID和员工姓名列表。
E.g。
SELECT ID, Forename + ' ' + Surname FROM Staff ORDER BY Surname, Forename
您的Bind
您的顶级转发器(在第一个实例中,以后您可以绑定到一组对象)DataTable
填充您的查询。
在此Repeater中,用户将选择要查看详细信息的行,然后单击“查看详细信息”类型按钮。
单击此按钮时,它会触发一个事件,该事件将循环遍历Repeater的行(RepeaterItems
),并记下所选行ID的注释(以CSV格式表示)(您可以将它们存储在控件中/行中的元素。)
然后,它将使数据库调用修改后的查询并随之传递CSV ID。
然后Bind
详细信息转发到第二个数据。
一些谷歌搜索应该填补所有空白; - )
HTH
答案 2 :(得分:0)
数据源可以是任何类型的集合,数组,数据表或类似的。只需设置引用(repeater.DataSource = someCollection;)和bind(repeater.DataBind())。因此,从Linq2Sql,EF,DataSets / TableAdapter,DataReader获取您的集合......只需确保它在任何集合对象类型中。中继器足够聪明,可以使用它的对象 您可以使用简单的&lt;%= Eval(“Property或column”)%&gt;访问每个对象的属性(值)在Repeater项目模板中。