如何在页面加载事件中显示嵌套中继器的数据?

How to show data of nested repeaters in page load event?

我正在尝试创建一个评论回复框,我在其中使用了两个转发器,一个用于评论,另一个用于回复。两个转发器在显示数据方面都工作正常,但主要问题是当我提交对我的评论的回复时,回复 不显示 只是在单击提交按钮后。当我再次加载页面时,回复会显示在页面上。

下面是我的aspx代码

<div>

    <asp:Repeater runat="server" ID="repAnswer" EnableViewState="True" OnItemDataBound="OnItemDataBound">
        <ItemTemplate>
            <h6>Answer</h6>
            <p><%# Eval("Answer") %></p>
            <asp:Label runat="server" ID="lblAnsId" Text='<%# Eval("AnsId")%>' ></asp:Label>
            <a class="link" id='lnkReplyParent<%#Eval("AnsId") %>' href="javascript:void(0)" onclick="showReply(<%#Eval("AnsId") %>);return false;">Reply</a>   
            <a class="link" id="lnkCancle" href="javascript:void(0)" onclick="closeReply(<%#Eval("AnsId") %>);return false;">Cancle</a>  
              <div id='divReply<%#Eval("AnsId") %>' style="display:none;">  
                 <asp:TextBox ID="textCommentReplyParent" CssClass="input-group" runat="server" Width="300px" TextMode="MultiLine" EnableViewState="True"></asp:TextBox>  
                 <br />  
                 <asp:Button ID="btnReplyParent" runat="server" Text="Reply" OnClick="btnReply_Click" /></div>

            <div>
                <asp:Repeater runat="server" ID="repRply">
                    <ItemTemplate>
                      <p><%# Eval("reply") %></p>
                    </ItemTemplate>
                </asp:Repeater>
            </div>
        </ItemTemplate>
    </asp:Repeater>

</div>

下面是我的cs页面代码

protected void btnReply_Click(object sender, EventArgs e)
{
    RepeaterItem item = (sender as Button).NamingContainer as RepeaterItem;
    rplycmnt =(item.FindControl("textCommentReplyParent") as TextBox).Text.Trim();
    answerid=Convert.ToInt32((item.FindControl("lblAnsId") as Label).Text);
    OnlineSubjects onlinesub = new OnlineSubjects()
    {
        reply = rplycmnt,
        AnsId = answerid
    };
    onlinesub.addReply();
}

//getting replies
protected void OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        answerid = Convert.ToInt32((e.Item.FindControl("lblAnsId") as Label).Text);
        Repeater repRply = e.Item.FindControl("repRply") as Repeater;
        OnlineSubjects onlinerply = new OnlineSubjects()
        {
            AnsId = answerid
        };
        onlinerply.showReply();
        repRply.DataSource = onlinerply.showReply();
        repRply.DataBind();
    }
}

注释代码... 发表此评论后,我们可以回复此评论

protected void btnAnswer_Click(object sender, EventArgs e)
    {
        OnlineSubjects onlinesub = new OnlineSubjects()
        {  
            Answer = txtAddAnswer.Text.Trim(),
            QuesId=Id
        };
        onlinesub.addAnswer();
        txtAddAnswer.Text = "";
        GetAnswer();
    }

显示评论的代码

private void GetAnswer()
    {
        OnlineSubjects onlineans = new OnlineSubjects()
        {
            QuesId = Id
        };
        onlineans.showAnswer();
        repAnswer.DataSource = onlineans.showAnswer();
        repAnswer.DataBind();
    }

页面加载时

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            GetAnswer();       
        }  
    }

您应该在 btnReply_Click 方法中将内部转发器重新绑定到更新后的数据源。

回复后需要调用getanswer

protected void btnReply_Click(object sender, EventArgs e)
{
    RepeaterItem item = (sender as Button).NamingContainer as RepeaterItem;
    rplycmnt =(item.FindControl("textCommentReplyParent") as TextBox).Text.Trim();
    answerid=Convert.ToInt32((item.FindControl("lblAnsId") as Label).Text);
    OnlineSubjects onlinesub = new OnlineSubjects()
    {
        reply = rplycmnt,
        AnsId = answerid
    };
    onlinesub.addReply();
    GetAnswer(); 
}

顺便说一句,你调用了两次answer,这是浪费资源。改变它如下。同时将方法名称更改为 bindsanswers,因为它绑定数据

private void BindAnswers()
    {
        OnlineSubjects onlineans = new OnlineSubjects()
        {
            QuesId = Id
        };
        var answers = onlineans.showAnswer();
        repAnswer.DataSource = answers;
        repAnswer.DataBind();
    }