Как повторно привязать ListView к событию OnClick кнопки?

#c# #asp.net #listview

#c# #asp.net #listview

Вопрос:

сначала это казалось простым, но я не могу заставить его работать.

У меня следующий сценарий:

         <asp:ListView ID="CommentsListView" runat="server">
            <LayoutTemplate>
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
            </LayoutTemplate>
            <ItemTemplate>
                <UC:Comment runat="server" CommentItem="<%# CurrentComment %>" />
                <br />
            </ItemTemplate>
        </asp:ListView>
        <asp:TextBox ID="NewComment" runat="server" />
        <asp:ImageButton ImageUrl="/images/ball.png" runat="server"
                      OnClick="SubmitComment" />
  

Код:

     protected void Page_Load(object sender, EventArgs e)
    {
         RenderListView();
    }

    protected void RenderListView()
    {
        CommentsListView.DataSource = //Get the data source objects
        CommentsListView.DataBind();
    }

    protected CommentObject CurrentComment
    {
        get { return (CommentObject)Page.GetDataItem(); }
    }

    protected void SubmitComment(object sender, ImageClickEventArgs e)
    {   
        //code to submit comment

        RenderListView();
    }
  

в принципе, когда я отправляю комментарий, я хочу видеть его в ListView, но я этого не делаю. «MyControl» получает нулевой комментарий в обратной публикации для всех элементов (не только для нового).

Только после обновления страницы я могу увидеть новый комментарий, который я отправил. Однако я не могу обновлять страницу при каждой отправке, потому что этот код находится внутри UpdatePanel (проблема возникает и без UpdatePanel).

Есть идеи, как это решить?

Ответ №1:

Я не могу найти никаких подробностей по этому поводу, но у меня есть подозрение, что проблема вызвана пользовательским элементом управления в вашем ItemTemplate. Можете ли вы удалить его и посмотреть, работает ли это?

Комментарии:

1. Устранение проблемы не решает ее 🙂 Проблема в том, что элемент управления получает значение null CurrentComment . За пределами UC все работает.

Ответ №2:

Я заметил, что вы вызываете RenderListView как в SubmitComment, так и в PageLoad, что, как я полагаю, приведет к его повторному запуску при нажатии кнопки (при первом запуске PageLoad). Похоже, что опубликованный вами код упрощен. Возможно ли, что в загрузке страницы что-то происходит, что саботирует ваши шаги SubmitComment?

Комментарии:

1. эй, Джозеф, Page_Load больше ничего не делает, я не вижу, как это саботирует отправку. Я должен отметить, что отправка работает, и источник данных всегда получает действительный список ненулевых комментариев, проблема только в UC, который, похоже, не получает объект comment (но вместо этого получает null).

Ответ №3:

Я, наконец, решил это, если кто-то еще может столкнуться с этим —

Решение состояло в том, чтобы избежать «<%#» и вместо этого использовать событие ItemDataBound:

  <asp:ListView ID="Comments" runat="server" 
OnItemDataBound="CommentsItemDataBound">
  

и сам метод:

 protected void CommentsItemDataBound(object sender, ListViewItemEventArgs e)
{
    var commentItem = (Comment)(((ListViewDataItem)e.Item).DataItem);

    var commentControl = (Comment)e.Item.FindControl("CommentControl");
    commentControl.CommentItem = commentItem;
}
  

Таким образом, привязка каждого элемента управления работает должным образом.