【问题标题】:asp.net wrap a div on a repeater every 3 resultsasp.net 每 3 个结果在中继器上包装一个 div
【发布时间】:2014-05-24 03:21:03
【问题描述】:

我不做 asp.net,但我所在的项目是内置的,如果这是一个非常简单的问题,请见谅:

以下代码可以很好地提取结果,但如果可能,我想在每 3 个结果周围添加一个包装器

<asp:Repeater ID="rptPendingCourses" runat="server" OnItemDataBound="rptPendingCourses_ItemDataBound">
    <ItemTemplate>
        <div class="coursesContainer">
            <div class="coursesContent as">
                <p class="title"><a onclick="linkcourse('<%#DataBinder.Eval(Container.DataItem, "CourseID")%>');return false;" href="#" title='Launch <%# DataBinder.Eval(Container.DataItem, "CourseTitle")%>'><%# System.Web.HttpUtility.HtmlEncode((String)(DataBinder.Eval(Container.DataItem, "CourseTitle").ToString().Length > 25 ? DataBinder.Eval(Container.DataItem, "CourseTitle").ToString().Remove(22) + "..." : DataBinder.Eval(Container.DataItem, "CourseTitle")))%></a></p>
                <ajax:Rating ID="courseRating" runat="server" Visible="false" MaxRating="5" ReadOnly="true"BackColor="Transparent"StarCssClass="ratingStar png" EmptyStarCssClass="emptyRatingStar png" WaitingStarCssClass="waitingRatingStar png" FilledStarCssClass="filledRatingStar png" />
                                <div class="clear"></div>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

所以希望它包装每 3 个结果,所以会是这样的

<div class="courseWrapper">
  <div class="courseContainer">......</div>
  <div class="courseContainer">......</div>
  <div class="courseContainer">......</div>
</div>

<div class="courseWrapper">
  <div class="courseContainer">......</div>
  <div class="courseContainer">......</div>
  <div class="courseContainer">......</div>
</div>

提前致谢

CS 代码:

/* Pending Courses */
rptPendingCourses.DataSource = pendingCourses();
rptPendingCourses.DataBind();

public DataSet pendingCourses()
    {
        DataSet dataSet = new DataSet();
        User user = (User)Context.Items["CurrentUser"];

        SqlConnection selectConnection = new SqlConnection(ConfigurationSettings.AppSettings["DBConnectStr"]);
        SqlDataAdapter adapter = new SqlDataAdapter("dbo.procCataloguesGetAllCoursesByRating", selectConnection);
        adapter.SelectCommand.CommandType = CommandType.StoredProcedure;

        // get results
        adapter.SelectCommand.Parameters.Add("@FilterByDomain", SqlDbType.Bit).Value = 0;
        if (user.Domain.Guid != Guid.Empty) {
            adapter.SelectCommand.Parameters.Add("@DomainID", SqlDbType.UniqueIdentifier).Value = user.Domain.Guid;
        }
        adapter.SelectCommand.Parameters.Add("@Culture", SqlDbType.VarChar, 6).Value = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
        adapter.SelectCommand.Parameters.Add("@IsEnabled", SqlDbType.Bit).Value = 1;
        adapter.SelectCommand.Parameters.Add("@DomainAdminID", SqlDbType.UniqueIdentifier).Value = Guid.Empty;

        try
        {
            dataSet = new DataSet();
            adapter.Fill(dataSet);
        }
        catch (Exception exception)
        {
            dataSet.Dispose();
            dataSet = null;
            LMS_DB.LMS_DB.LogErrorEvent(exception.Message, AuditEntryType.CatalogueCoursesGetCourses);
        }
        finally
        {
            if (selectConnection.State == ConnectionState.Open)
            {
                selectConnection.Close();
            }
        }
        return dataSet;
    }

protected void rptPendingCourses_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        DataRowView dataItem = (DataRowView)e.Item.DataItem;
        if (Convert.ToBoolean(dataItem.Row["RatingsEnabled"]))
        {
            Rating rating = (Rating)e.Item.FindControl("courseRating");
            rating.Visible = true;
            rating.CurrentRating = Convert.ToInt32(dataItem.Row["AverageRating"]);
        }

    }

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    如果您使用 ListView 控件来显示数据,您可以选择指定 &lt;GroupTemplate&gt; 以及 GroupItemCount 属性:

    <asp:ListView
            GroupItemCount="3" 
            ID="rptPendingCourses"
            runat="server"
            OnItemDataBound="rptPendingCourses_ItemDataBound">
        <LayoutTemplate>
            <div runat="server" ID="groupPlaceholder"></div>
        </LayoutTemplate>
        <GroupTemplate>
            <div class="courseWrapper">
                <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
            </div>
        </GroupTemplate>
        <ItemTemplate>
        <div class="coursesContainer">
            <div class="coursesContent as">
                <p class="title"><a onclick="linkcourse('<%#DataBinder.Eval(Container.DataItem, "CourseID")%>');return false;" href="#" title='Launch <%# DataBinder.Eval(Container.DataItem, "CourseTitle")%>'><%# System.Web.HttpUtility.HtmlEncode((String)(DataBinder.Eval(Container.DataItem, "CourseTitle").ToString().Length > 25 ? DataBinder.Eval(Container.DataItem, "CourseTitle").ToString().Remove(22) + "..." : DataBinder.Eval(Container.DataItem, "CourseTitle")))%></a></p>
                <ajax:Rating ID="courseRating" runat="server" Visible="false" MaxRating="5" ReadOnly="true" BackColor="Transparent" StarCssClass="ratingStar png" EmptyStarCssClass="emptyRatingStar png" WaitingStarCssClass="waitingRatingStar png" FilledStarCssClass="filledRatingStar png" />
                                <div class="clear"></div>
            </div>
        </div>
        </ItemTemplate>
    </asp:ListView>
    

    那么,对于 OnItemDataBound 事件,我觉得你需要改成这样:

    protected void rptPendingCourses_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            ListViewDataItem listItem = (ListViewDataItem)e.Item;
            DataRowView dataItem = (DataRowView)listItem.DataItem;
            if (Convert.ToBoolean(dataItem.Row["RatingsEnabled"]))
            {
                Rating rating = (Rating)e.Item.FindControl("courseRating");
                rating.Visible = true;
                rating.CurrentRating = Convert.ToInt32(dataItem.Row["AverageRating"]);
            }
        }
    }
    

    【讨论】:

    • 我不知道如何修改它,实际上只是被扔进了这个。如果我添加该代码,您是否也可以提供帮助?
    • 首先,实现我的 ListView 示例,但没有 OnItemDataBound 属性,看看它是否有效。然后将 rptPendingCourses_ItemDataBound 的代码也添加到您的问题中,以便我们查看
    • 我收到解析器错误消息:服务器标签在 ajax:Rating 行上的格式不正确
    • 这可能是因为 ajax:Rating 控件中的某些属性之间没有空格。我已经在我的 ListView 示例中添加了空格,请也更新您的代码...
    • 感谢我收到 rptPendingCourses.DataSource = pendingCourses();现在但正如你所说的事情可能需要修复,所以我现在将使用所有代码更新问题
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多