Repeater嵌套的两种方案

本文介绍了在ASP.NET项目中使用Repeater控件进行嵌套显示数据的方法,解决了当某些子项没有直接父项时出现的约束错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://tmouse.cnblogs.com/archive/2006/05/28/256274.html

 

http://support.microsoft.com/default.aspx?scid=kb;en-us;306154#top

 

在做“主页大巴”项目的时候,现有两次遇到要用到Repeater嵌套,但方法不同,如下:

首先是各个科组教师的主页要分类显示,这个好办,因为用户都是按科组申请注册的,只要他的主页类别是个人主页,就可以做好父子绑定GroupID

程序参考:http://support.microsoft.com/default.aspx?scid=kb;en-us;306154

其二是在个人主页里按栏目分类显示文章时,按理父子关系该是文章的ClassID的父目录是栏目的ClassID,但是有的栏目并没有2级目录,所以文章直接添加在它上面,这样前面的父子关系就不成立,会出现“不能启用此约束,因为不是所有的值都具有相应的父值”的错误报告,后来按这个错误搜索,最后找到优快云里的这个帖子,csdn的saucer(思归) ( 五星(高级))老大给了解决方法,我修改了一下,应用到我的程序中。

程序参考:http://community.youkuaiyun.com/Expert/topic/4229/4229787.xml?temp=.8814051

我修改的程序如下:
aspx中:

< asp:Repeater id = " repLM "  runat = " server " >
    
< ItemTemplate >
        
< table border = " 0 "  style = " BORDER-COLLAPSE: collapse "  width = " 98% "  id = " table8 "   class = " list " >
            
< tr >
                
< td colspan = " 2 " >
                    
< div align = " center " >
                        
< table border = " 0 "  style = " BORDER-COLLAPSE: collapse "  width = " 100% "  id = " table9 " >
                            
< tr >
                                
< td  class = " listTop " >& nbsp; < img src = " <%=strStylePath%>dot2.gif " >& nbsp; <% # DataBinder.Eval(Container.DataItem, " ClassName " %></ td >
                            
</ tr >
                            
< tr >
                                
< td >
                                    
< table border = " 0 "  style = " border-collapse: collapse "  width = " 100% "  id = " table10 " >
                                        
< asp:Repeater id = " repWZ "  runat = " server " >
                                            
< ItemTemplate >
                                                
< tr >
                                                    
< td >< img border = " 0 "  src = " <%=strStylePath%>list.gif "  width = " 15 "  height = " 6 " >< a href = ' Show.aspx?AtcID=<%# DataBinder.Eval(Container.DataItem,"AtcID") %> ' >< font color = ' <%# DataBinder.Eval(Container.DataItem,"TitleColor") %> ' ><% # DataBinder.Eval(Container.DataItem, " Title " %></ font ></ a >
                                                    
</ td >
                                                
</ tr >
                                            
</ ItemTemplate >
                                        
</ asp:Repeater >
                                    
</ table >
                                
</ td >
                            
</ tr >
                        
</ table >
                    
</ div >
                
</ td >
            
</ tr >
            
< tr >
                
< td width = " 87% " >
                
</ td >
                
< td width = " 12% "   class = " more " >< span lang = " zh-cn " > 更多 </ span ></ td >
            
</ tr >
        
</ table >
     </ ItemTemplate >
</ asp:Repeater >


cs中的程序如下:

protected  System.Web.UI.WebControls.Repeater repLM;
protected  System.Web.UI.WebControls.Repeater repWZ;

 

// 先邦定栏目
string  strSQL1 = " select ClassID,ClassName from xClass where ParentID=0 and PageID= " + strPageID;
SqlDataAdapter da1
= new  SqlDataAdapter(strSQL1,myConn);
da1.Fill(ds,
" LM " );
repLM.DataSource
= ds.Tables[ " LM " ].DefaultView;
repLM.DataBind();        
myConn.Close();

在外面的Repeater的ItemDataBound事件里写如下程序:

private   void  repLM_ItemDataBound( object  sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    
    
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    

        Repeater rpColumnNews 
= (Repeater) e.Item.FindControl("repWZ"); 
        
//找到分类Repeater关联的数据项 
        DataRowView rowv = (DataRowView)e.Item.DataItem; 
        
//提取分类ID 
        string strClassID = Convert.ToString(rowv["ClassID"]); 
        
//里面的Repeater
        string strSQL2="select xArticle.AtcID,xArticle.Title,xArticle.TitleColor from xArticle,xClass where ";
        strSQL2
+=" (xArticle.ClassID=xClass.ClassID and xClass.ClassID="+strClassID+") or (xArticle.ClassID=xClass.ClassID and xClass.ParentID="+strClassID+")";
        SqlDataAdapter da2
=new SqlDataAdapter(strSQL2,myConn);
        ds
=new DataSet();
        da2.Fill(ds,
"WZ");
        rpColumnNews.DataSource
=ds.Tables["WZ"].DefaultView;
        rpColumnNews.DataBind();        
        myConn.Close();
    }
 

}
<think>好的,我现在需要回答用户关于QML中Column布局实现3x3排列的问题。首先,我得确认用户的问题是什么。QML是Qt Modeling Language,用于设计用户界面,而Column布局通常用于垂直排列元素。但用户提到的是3x3排列,也就是一个网格布局,可能需要多个行或列的组合。 首先,我应该回忆一下QML中的布局组件。通常,Column和Row是用来垂直和水平排列的,而Grid布局则是专门处理网格排列的。不过用户可能想用Column嵌套Row或者其他方式来实现3x3。需要确认用户是否真的希望用Column来实现,或者是否有其他误解。 假设用户确实想用Column来达成3x3,可能需要嵌套使用Column和Row。例如,一个Column包含三个Row,每个Row有三个元素。这时候需要解释如何通过嵌套布局来实现,同时指出可能有更合适的组件如Grid或GridLayout。 然后,我需要考虑QML中的Grid和GridLayout的区别。Grid是比较基础的,而GridLayout来自QtQuick.Layouts模块,提供更灵活的布局管理,比如自动调整大小和对齐。因此,应该比较这两种方法的优劣,并给出示例代码。 接下来,我需要确保回答结构清晰,分步骤说明。首先介绍使用Column嵌套Row的方法,然后介绍更推荐的Grid或GridLayout。每个部分都需要代码示例,并解释关键属性和用法,如rows、columns、spacing、anchors.fill等。 同时,需要检查LaTeX格式是否正确,用户提到的数学表达式需要用$...$或$$...$$。但在这个问题中可能用不到数学公式,不过还是要确保其他格式正确,如代码块用反引号包裹,语言标注正确。 另外,用户要求使用中文回答,所以要保持语言准确,术语正确。可能需要解释一些QML专有名词,如Item、anchors、spacing等,确保用户理解。 最后,总结部分需要比较不同方法的适用场景,帮助用户根据需求选择最合适的布局方式。提醒用户如果不需要动态调整布局,Grid足够;若需要响应式布局,则使用GridLayout。 现在,我需要组织这些思考点,形成一个结构清晰的回答,逐步引导用户理解不同的实现方式,并推荐最佳实践。确保代码示例正确,语法无误,解释到位。</think>在QML中实现3x3排列通常有两种方式:通过嵌套布局或使用专用网格组件。以下是逐步说明: 1. **使用`Column`嵌套`Row`实现(非推荐方案)** ```qml Column { spacing: 5 // 纵向间距 Repeater { model: 3 Row { spacing: 5 // 横向间距 Repeater { model: 3 Rectangle { width: 50; height: 50 color: "lightblue" border.color: "navy" } } } } } ``` - 原理:外层`Column`创建垂直排列,内部每个`Row`生成水平排列 - 缺点:需要手动控制尺寸和对齐,布局不够灵活 2. **推荐方案:使用`Grid`组件** ```qml Grid { columns: 3 // 定义列数 rows: 3 // 定义行数 spacing: 5 Repeater { model: 9 Rectangle { width: 50; height: 50 color: "lightgreen" border.color: "darkgreen" } } } ``` - 自动计算行列位置 - 支持行列间距统一控制 3. **高级方案:使用`GridLayout`(需导入`QtQuick.Layouts`)** ```qml import QtQuick.Layouts 1.15 GridLayout { columns: 3 rows: 3 columnSpacing: 5 rowSpacing: 5 Repeater { model: 9 Rectangle { Layout.fillWidth: true Layout.fillHeight: true color: "salmon" border.color: "maroon" } } } ``` - 优势:自动调整子项尺寸 - 支持百分比布局和锚定 - 适合响应式界面设计 **关键差异对比表**: | 特性 | Column+Row嵌套 | Grid | GridLayout | |-------------------|----------------|------------|------------------| | 自动尺寸调整 | ❌ | ❌ | ✔️ | | 动态添加/删除元素 | 需手动调整 | 自动适应 | 自动适应 | | 布局复杂度 | 高 | 中 | 低 | | 性能 | 一般 | 较好 | 较好(带优化) | 建议根据需求选择: - 简单静态布局 → `Grid` - 复杂动态布局 → `GridLayout` - 特殊排列需求 → 嵌套布局(如需要非均匀行列分布时)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值