Repeater控件的嵌套使用

    Repeater控件专门用于精确内容的显示,它也是基于模板的方式,不过它不会自动生成任何用于布局的代码。Repeater控件甚至没有默认的外观,它完全是通过模板控制。而却也只能通过源代码视图进行模板的编辑。Repeater控件由于不自动生成任何HTML标签,所以带来的效率上的提升,也使精确展示内容成为可能。本文将介绍Repeater控件的嵌套使用,如图1.1所示。

图1.1  Repeater控件的嵌套使用

1、页面代码

<%-- 一级Repeater绑定班级信息 --%>
<asp:Repeater ID="rptClassInfo" runat="server" OnItemCreated="On_rptCatsItemCreated">
    <ItemTemplate>
        <div class ="classInfo">
            <h3><%# Eval("ClassName") %></h3>
            <div class="stuInfo">
                <ul class="title">
                    <li>姓名</li>
                    <li>性别</li>
                    <li>年龄</li>
                </ul>
                <%-- 二级Repeater绑定学生信息 --%>
                <asp:Repeater ID="rptStudentInfo" runat="server">
                    <ItemTemplate>
                        <ul class="<%# Container.ItemIndex%2==0?"cor1":"cor2" %>">  <%-- 根据单双行增加样式 --%>
                            <li><%# DataBinder.Eval(Container.DataItem,"Name") %></li>
                            <li><%# DataBinder.Eval(Container.DataItem,"Sex") %></li>
                            <li><%# DataBinder.Eval(Container.DataItem,"Age") %></li>
                        </ul>
                    </ItemTemplate>
                </asp:Repeater>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

RepeaterItem 成员属性

Container.ItemIndex:获取Repeater控件的Items集合中的项的索引。

Container.DataItem:获取Repeater控件中RepeaterItem对象关联的数据项。

2、CS端逻辑代码

//绑定班级信息(一级Repeater)
public void BindClassInfo()
{
    List<ClassInfo> classInfoList = GetClassInfoList();//获取所有班级信息
    rptClassInfo.DataSource = classInfoList;
    rptClassInfo.DataBind();
}

//绑定学生信息(二级Repeater)
public void On_rptCatsItemCreated(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Repeater rptStudentInfo = e.Item.FindControl("rptStudentInfo") as Repeater;
        if (rptStudentInfo != null)
        {
            ClassInfo classInfo = e.Item.DataItem as ClassInfo;
            if (classInfo != null && classInfo.StudentList!=null)
            {
                rptStudentInfo.DataSource = classInfo.StudentList;
                rptStudentInfo.DataBind();
            }
        }
    }
}

3、辅助代码

(1) 班级信息实体类:

/// <summary>
/// 班级信息实体类
/// </summary>
public class ClassInfo 
{
    public string ClassName { get; set; }                //班级名称
    public List<StudentInfo> StudentList { get; set; }   //学生列表
}

(2) 学生信息实体类:

/// <summary>
/// 学生信息实体类
/// </summary>
public class StudentInfo
{
    public string Name { get; set; }   //学生姓名
    public string Sex { get; set; }   //学生性别
    public int Age { get; set; }   //学生年龄
}

(3) 获取所有班级信息方法:

/// <summary>
/// 获取所有班级信息
/// </summary>
/// <returns></returns>
public List<ClassInfo> GetClassInfoList()
{
    List<ClassInfo> classInfoList = new List<ClassInfo>();
    //创建班级1信息
    List<StudentInfo> studentList1 = new List<StudentInfo>();
    StudentInfo stu1 = new StudentInfo() { Name = "李涛", Sex = "男", Age = 13 };
    StudentInfo stu2 = new StudentInfo() { Name = "陈浩", Sex = "男", Age = 12 };
    StudentInfo stu3 = new StudentInfo() { Name = "王林", Sex = "女", Age = 10 };
    StudentInfo stu4 = new StudentInfo() { Name = "李成", Sex = "男", Age = 13 };
    studentList1.Add(stu1);
    studentList1.Add(stu2);
    studentList1.Add(stu3);
    studentList1.Add(stu4);

    ClassInfo classInfo1 = new ClassInfo();
    classInfo1.ClassName = "高一(1)班";
    classInfo1.StudentList = studentList1;

    //创建班级2信息
    List<StudentInfo> studentList2 = new List<StudentInfo>();
    StudentInfo stu5 = new StudentInfo() { Name = "王丽", Sex = "女", Age = 15 };
    StudentInfo stu6 = new StudentInfo() { Name = "孙柳", Sex = "男", Age = 12 };
    StudentInfo stu7 = new StudentInfo() { Name = "刘杰", Sex = "男", Age = 11 };
    StudentInfo stu8 = new StudentInfo() { Name = "陈红", Sex = "女", Age = 12 };
    studentList2.Add(stu5);
    studentList2.Add(stu6);
    studentList2.Add(stu7);
    studentList2.Add(stu8);

    ClassInfo classInfo2 = new ClassInfo();
    classInfo2.ClassName = "高一(2)班";
    classInfo2.StudentList = studentList2;

    //创建班级3信息
    List<StudentInfo> studentList3 = new List<StudentInfo>();
    StudentInfo stu9 = new StudentInfo() { Name = "张铮", Sex = "男", Age = 14 };
    StudentInfo stu10 = new StudentInfo() { Name = "李冰", Sex = "女", Age = 12 };
    StudentInfo stu11 = new StudentInfo() { Name = "杜涛", Sex = "男", Age = 13 };
    studentList3.Add(stu9);
    studentList3.Add(stu10);
    studentList3.Add(stu11);

    ClassInfo classInfo3 = new ClassInfo();
    classInfo3.ClassName = "高一(3)班";
    classInfo3.StudentList = studentList3;

    classInfoList.Add(classInfo1);
    classInfoList.Add(classInfo2);
    classInfoList.Add(classInfo3);
    return classInfoList;
}

(4) 页面CSS代码:

<style type="text/css">
    *{padding:0px; margin:0px; }
    body {font: 12px/1.6em Helvetica,Arial,sans-serif;}
    ul{overflow:hidden; list-style:none;}
    ul li{float:left;}
    .classInfo{margin:10px; width:165px; border:1px solid #aaaaaa; float:left;}
    .classInfo h3{background: none repeat scroll 0 0 #3B5998;color: #FFFFFF;height: 26px;line-height: 26px;text-indent: 6px;}
    .classInfo .stuInfo ul li{width:50px; text-align:center;}
    .classInfo .stuInfo .title{font-weight:bold;}
    .classInfo .stuInfo .cor1{background-color:#f1f4f2;}
    .classInfo .stuInfo .cor2{background-color:#d6d6d6;}
</style>

*4、知识补充

(1) Repeater绑定Dictionary字典:

 

Repeater绑定一般的Dictionary如Dictionary<string, string>,获取值的时候很容易,绑定方法是:

Key:<%#Eval("key") %>;

Value:<%#Eval("Value") %>

(2) Repeater绑定数组:

如数组:string[] users = {"Peter" ,  "Kevin",  "Polo"};

绑定方法:<%#Container.DataItem %>

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值