0

外側のリピーターの ItemTemplate に、Ajax アコーディオンのリピーターがあります。

わかりやすいように、各投稿の下にコメントがあるブログですが、これらのコメントはアコーディオンで折りたたまれています。

OnItemDataBound を使用して、外側のリピーターでアコーディオンを見つけ、Accordion.FindControl を使用して内側のリピーターを見つけることで、リピーターがアコーディオン内にネストされていることを確認できます。ここまでは順調ですね。

ただし、実際には、そのブログ投稿に固有のコメントだけでなく、すべてのコメントがバインドされています。ID = KeyID である各ブログ投稿に関連するコメントを選択できるように、内部のネストされた Repeater に KeyID を渡すことができる必要があります。

ID が RepeaterItemEventArgs に何らかの形で関連付けられると推測していますが、それがどのように発生するのか、または使用しているブログの KeyID を特定する方法がわかりません。

    protected void BindComments(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item)
        {
            AjaxControlToolkit.Accordion myCommentsAccordion = (AjaxControlToolkit.Accordion)e.Item.FindControl("CommentsAccordion");
            Repeater myCommentRepeater = (Repeater)myCommentsAccordion.FindControl("CommentsRepeater");

            Utility myUtility = new Utility();
            SqlConnection myConn = myUtility.GetConnection();
            string myCommandText = "select [CommentID],[ShadeID],[Commenter],[CommentDate],[Comment] from [Comments] where ShadeID = " + ???? + " order by CommentDate DESC";

さらに詳しい情報が役立つ場合は、お知らせください。何が役に立ち、何が質問を混乱させているのかわかりません。

更新 - 以下で要求された aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="TestShades.aspx.cs" Inherits="DisciplesWalk.TestShades" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="Content" runat="server">
<asp:Image ImageAlign= "Middle" ID="ShadesBanner" runat="server" ImageUrl="~/Images/Banners/Shades.jpg" />
<asp:Label ID="myErrorLabel" runat="Server"  CssClass="failureNotification"></asp:Label>
    <div id="ShadesDiv" class="ShadesDiv">
    <asp:Repeater ID="ShadesRepeater" runat="server" OnItemDataBound="BindComments">
        <ItemTemplate>
            <!-- top level repeater element template here -->
            <br />
            <asp:Label ID="ShadeDate" CssClass="ShadeDate" runat="server" Width="100%" Text='<%# Bind("ShadeDate", "{0:MM/dd/yyyy}") %>'></asp:Label>
            <span class="notehead">
            <asp:Label ID="ShadeTitle" CssClass="ShadeHeading" runat="server" Width="100%" Text='<%# Bind("ShadeTitle")%>'></asp:Label>
            </span>
            <br /><br />
            <span>
            <img alt="" src="Images/shades/<%# Eval("ShadeImage") %>"  style = "width:200px; padding-right:9px; padding-top:0px; padding-bottom:3px; float:left;" />
            <%# Eval("ShadeBody") %>
            </span>
            <br />
            <AjaxToolkit:Accordion ID="CommentsAccordion" runat="server"
            SelectedIndex="-1"
            CssClass="accordion"
            HeaderCssClass="accordionHeader"
            HeaderSelectedCssClass="accordionHeaderSelected"
            ContentCssClass="accordionContent"
            AutoSize="None"
            FadeTransitions="true"
            TransitionDuration="250"
            FramesPerSecond="40"
            RequireOpenedPane="false"
            SuppressHeaderPostbacks="true">
            <Panes>
                <AjaxToolkit:AccordionPane runat="server" ID="OverviewPane">
                    <Header>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Comments</Header>
                    <Content>
                        <div style="overflow-y:scroll;height:450px"> 
                            <asp:Repeater ID="CommentsRepeater" runat="server">
                                <ItemTemplate>
                                    <br />
                                    <span>
                                    <asp:Label ID="CommenterLabel" runat="server" Width="100%" Text='<%# Eval("Commenter")%>'></asp:Label>&nbsp;&nbsp;
                                    <asp:Label ID="Label1" runat="server" Width="100%" Text='<%# Eval("CommentDate")%>'></asp:Label>
                                    </span>
                                    <span>
                                    <asp:Label ID="CommentBody" runat="server" Width="100%" Text='<%# Eval("Comment")%>'></asp:Label>
                                    </span>
                                    <br />
                                    <hr class="HRSeperator" />
                                    <br /><br />
                                </ItemTemplate> 
                            </asp:Repeater>
                        </div>
                    </Content>
                </AjaxToolkit:AccordionPane>
            </Panes>
        </AjaxToolkit:Accordion>
        </ItemTemplate>
        <SeparatorTemplate>
            <br />
            <asp:Image ID="Image2" runat="server" ImageUrl="~/Images/separator.jpg" ImageAlign="Middle" />
            <br /><br />
        </SeparatorTemplate> 
    </asp:Repeater>
    </div>
    <asp:Table ID="AddCommentTable" runat="server" CellPadding="12" cellspacing="0" width="100%" Visible="false">
        <asp:TableRow>
            <asp:TableCell  HorizontalAlign="Left">
                <br />
                <asp:Label runat="server" ID="AddCommenterLabel" Text="Name:" Visible="True"></asp:Label>
                <br />
                <asp:TextBox ID="CommenterTextBox" runat="server" Width="25%"></asp:TextBox>
                <br />
                <asp:Label runat="server" ID="CommentLabel" Text="Your comment:" Visible="True"></asp:Label>
                <br />
                <asp:TextBox ID="CommentTextBox" runat="server" Width="90%"></asp:TextBox>
                <br /><br />
                <asp:Button ID="AddCommentButton" runat="server" Text="Submit Comment" onclick="AddCommentButton_Click" />
            </asp:TableCell>
        </asp:TableRow>
    </asp:Table>
</asp:Content>
4

1 に答える 1

1

私はあなたがこのようにすることができると思います:

の定義の上の .aspx ファイルで

<AjaxToolkit:Accordion ID="CommentsAccordion" runat="server" 

この行を入れてください

<asp:Label ID="lblShadeID" runat="server" Text='<%# Eval("ShadeID") %>' Visible="false"></asp:Label>

BindComments次に、メソッドに次のコードを使用します。

protected void BindComments(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {
        AjaxControlToolkit.Accordion myCommentsAccordion = (AjaxControlToolkit.Accordion)e.Item.FindControl("CommentsAccordion");
        Repeater myCommentRepeater = (Repeater)myCommentsAccordion.FindControl("CommentsRepeater");

        var label = e.Item.FindControl("lblShadeID") as Label;
        int shadeId = Convert.ToInt32(label.Text);

        Utility myUtility = new Utility();
        SqlConnection myConn = myUtility.GetConnection();
        string myCommandText = "select [CommentID],[ShadeID],[Commenter],[CommentDate],[Comment] from [Comments] where ShadeID = @shadeId order by CommentDate DESC";
        // set command parameter named @shadeId to the value of shadeId, execute the query and bind data to myCommentRepeater
    }
}

お役に立てれば。

よろしく、 ウロス

于 2013-10-31T20:32:51.987 に答える