Asp中继器控制

时间:2017-02-13 20:57:47

标签: c# asp.net repeater

我的转发器asp控件有问题。

我的数据库上有一个名为course的表,其中包含CourseID,CourseName,CourseLink和另一个名为module的表,其中包含ModuleID,ModuleName列。还有另一个名为时间表的表,其中包含CourseID和ModuleID列。

这种方式的工作方式是当我点击HyperLink1时,该段落与相同的课程ID相同,它会将段落的样式显示从隐藏更改为显示(我使用JavaScript来完成此功能,所以它&# 39;这不是问题。)

我想知道的是,如何列出与该特定课程ID相关的ModuleNames。

我在考虑在转发器中使用另一个转发器。然而,这只会让事情变得复杂,并且让人感到困惑。

我怎样才能让它工作,不用处理sql,因为我很乐意创建一个select命令。

这是ASP.NET论坛。

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSource1">
    <ItemTemplate>
        <p>
            <a id="HyperLink1" runat="server" href='<%# Eval("courselink") %>'>
                <%# Eval("CourseName") %>
            </a> <br />
        </p>

        <p id='<%# Eval("CourseID") %>' style="display:none">
            <%# Eval("ModulName") %>
        </p>
        <br />

    </ItemTemplate>
</asp:Repeater>

感谢您的时间,我期待着找到解决此问题的方法。

3 个答案:

答案 0 :(得分:1)

你几乎需要使用另一个转发器,这个技巧(如果我没记错的话,我自2011年以来就没有使用过旧的ASP.NET Web Forms)是你加入了ItemDataBound事件在您的代码后面为父转发器,然后使用事件参数来获取您与子表关联的ID,获取该数据,通过来自Repeater的id查找转发器(我认为它&#39 ; s发送者,但有一些方法来获取它)并绑定数据。

我想要注意ASP.NET MVC更容易和更清晰,并且通常不鼓励使用ASP.NET Web Forms。

答案 1 :(得分:1)

这可能是最糟糕的方式

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSource1">
<ItemTemplate>
    <p>
        <a id="HyperLink1" runat="server" href='<%# Eval("courselink") %>'>
            <%# Eval("CourseName") %>
        </a> <br />
    </p>

    <p id='<%# Eval("CourseID") %>' style="display:none">
       <%# moduleName(Eval("id").ToString()) %>
    </p>
    <br />

</ItemTemplate>

public string moduleName(string id)
{
    string returnValue = "<ul>";
    using (SqlConnection con = new SqlConnection(DB))
    {
        using (SqlCommand com = new SqlCommand("SELECT * FROM module WHERE id = @id", con))
        {
            com.Parameters.AddWithValue("@id", id);
            if (con.State == System.Data.ConnectionState.Closed)
            {
                con.Open();
                using (SqlDataReader dr = com.ExecuteReader())
                {
                    while (dr.Read())
                    {                            
                        returnValue += "<li>"+ dr["modulename"].ToString()+"</li>";
                    }
                }
                con.Close();
            }
        }
    }
    returnValue += "</ul>";
    return returnValue;
}

答案 2 :(得分:1)

最好的解决方案是为您的演示文稿创建强类型模型,不要使用Eval,您可以在webform中获得类似的内容:

<asp:Repeater runat="server" DataSourceID="<%# Model %>">
    <ItemTemplate>
        <p>
           <a href="<%# ((Course)Container.DataItem).Link %>"><%# ((Course)Container.DataItem).Name %></a>  
        </p>

        <p id='<%# ((Course)Container.DataItem).ID %>' style="display:none">
            <asp:Repeater runat="server" DataSource="<%# ((Course)Container.DataItem).Modules %>">
                <HeaderTemplate>
                    <ul>
                </HeaderTemplate>
                    <ItemTemplate>
                        <li><%# ((Module)Container.DataItem).Name %></li>
                    </ItemTemplate>
                <FooterTemplate>
                    </ul>
                </FooterTemplate>
            </asp:Repeater>
        </p>
</ItemTemplate>

然后在你的代码后面创建以下属性:

public List<Course> Model
{
    get
    {
        List<Course> courses = new List<Course>();
        // Some example data, in your situation you should instantiate the classes based on the data from the database.
        Course exampleCourse = new Course();
        exampleCourse.ID = 1;
        exampleCourse.Name = "Example course";

        // Create example module 1
        Module exampleModule1 = new Module();
        exampleModule1.ID = 10;
        exampleModule1.Name = "Example Module 1";

        // Create example module 2
        Module exampleModule2 = new Module();
        exampleModule2.ID = 11;
        exampleModule2.Name = "Example Module 2";

        // add modules to the course
        exampleCourse.Modules.Add(exampleModule1);
        exampleCourse.Modules.Add(exampleModule2);

        // add course to the courses
        courses.Add(exampleCourse);
        return courses;
    }
}

需要的课程:

public class Course
{
    public int ID { get; set; }
    public string Link { get; set; }
    public string Name { get; set; }
    public List<Module> Modules { get; set; }
    public Course()
    {
        this.Modules = new List<Module>();
    }
}

public class Module
{
    public int ID { get; set; }
    public string Name { get; set; }
}

最后,在你的页面加载中,不要忘记数据绑定:

protected void Page_Load(object sender, EventArgs e)
{
    this.DataBind();  
}