今天跟大家唠唠我搞 repeater 嵌套的那些事儿,真是一把鼻涕一把泪。
话说,最近接个活儿,要做一个带层级结构的展示页面。最开始想着用 treeview ,后来发现 repeater 控件更灵活,就决定用 repeater 嵌套来实现。结果,一上手就懵,这玩意儿比想象的难多。
第一步:先搭个架子
我得先把外层的 repeater 搞定。这个简单,直接从数据库里把数据拉出来,然后绑定到 repeater 上。代码大概是这样:
看到没,外层 repeater 里面又嵌套一个 repeater ,ID 是 `rptChild` 。
第二步:数据绑定是个坑
接下来就是关键,怎么把子 repeater 的数据绑定上去?我一开始的想法是,在 `rptParent_ItemDataBound` 事件里,找到子 repeater ,然后把对应的数据绑定上去。想法是挺但是实现起来就有点麻烦。
我试好几种方法,一开始是想直接用 `FindControl` 找子 repeater ,但是死活找不到。后来查资料才知道, repeater 里面的控件是在运行时动态生成的,不能直接用 `FindControl` 找到。得用更复杂一点的方法。
最终,我用 `NamingContainer` 来找到子 repeater 。代码大概是这样:
csharp
protected void rptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
if (* == * * == *)
// 找到子 Repeater
Repeater rptChild = (Repeater)*("rptChild");
// 获取父 Repeater 对应的数据项
DataRowView drv = (DataRowView)*;
// 根据父 Repeater 的 ID,查询子 Repeater 的数据
string parentId = drv["ParentId"].ToString();
DataTable dtChild = GetDataByParentId(parentId);
// 绑定数据
* = dtChild;
这段代码的关键在于:
- 判断当前 item 的类型,确保是数据行。
- 然后,用 `*("rptChild")` 找到子 repeater 。
- 从父 repeater 的数据项中获取 parentId 。
- 根据 parentId ,查询子 repeater 需要显示的数据。
- 把数据绑定到子 repeater 上。
第三步:样式调整也很重要
数据绑定好,但是页面看起来还是有点乱。因为 repeater 默认的样式比较简单,没有层次感。我又加一些 CSS 样式,让页面看起来更清晰。
例如,给子 repeater 加个缩进,让它看起来像是父 repeater 的子节点:
css
.child-repeater {
margin-left: 20px;
然后,在外层 div 上加个边框,让每个父节点看起来更独立:
css
.parent-item {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
踩坑与收获
这回搞 repeater 嵌套,真是踩不少坑。但是,最终还是搞定。有以下几点:
- repeater 嵌套的关键在于数据绑定,要用 `NamingContainer` 找到子 repeater 。
- 样式调整也很重要,要让页面看起来清晰有层次感。
- 遇到问题不要怕,多查资料,多尝试,总能找到解决方案。
这回实践让我对 repeater 控件有更深入的解。以后再遇到类似的需求,我就更有信心。
好,今天的分享就到这里。希望能对大家有所帮助。