Частичное возвращение сообщения приводит к тому, что кнопки полного возврата назад действуют как частичное возвращение сообщения, почему?

У меня есть элемент управления RadGrid, который динамически создается на page_init и добавляется в заполнитель, который находится внутри updatePanel на странице.

Мне нужно добавить новую кнопку в раздел CommandItem RadGrid. Кнопка должна поддерживать полную обратную передачу.

В RadGrid есть событие RadGrid_ItemCreated(), и именно здесь я добавил свою новую кнопку, и она появилась в моей RadGrid:

 protected virtual void RdGridItemCreated(object sender, GridItemEventArgs e)
    {
        var itemType = e.Item.ItemType;

        switch (itemType)
        {        
            // other cases...
            case GridItemType.CommandItem:
                {
                    var gridCommandItem = e.Item as GridCommandItem;

                    if (gridCommandItem == null) return;

                    if (this.EnablePdfExport)
                    {
                        var pdfButton = CreateExportToPdfButton();

                        PageUtil.RegisterPostBackControl(pdfButton);

                        // this is the cell which contains the export buttons.
                       ((Table)gridCommandItem.Cells[0].Controls[0]).Rows[0].Cells[1].Controls.Add(pdfButton);                                                        
                    }
                    break;
                }
        }
    }

У кнопки есть событие Click, и в качестве обработчика события был добавлен метод:

private Button CreateExportToPdfButton()
    {
        var result = new Button();
        result.ID = "btnExportToPdf";
        result.Click += ExportToPdfButtonClick;
        result.CssClass = "rgExpPDF";
        result.CommandName = "ExportToPdf";
        result.Attributes.Add("title", "Export to Pdf");            
        return result;
    }

Чтобы зарегистрировать событие обратной передачи для этого элемента управления, я использовал метод RegisterPostBackControl() ScriptManager.

 public static void RegisterPostBackControl(Control control)
    {
        var currentPage = (Page) HttpContext.Current.CurrentHandler;
        var currentScriptManager = ScriptManager.GetCurrent(currentPage);
        if (currentScriptManager != null)
        {
            currentScriptManager.RegisterPostBackControl(control);
        }
    }

Когда я нажимаю кнопку на RadGrid, он отправляет сообщение обратно на сервер, но проблема в том, что его событие Click никогда не вызывается:

private void ExportToPdfButtonClick(object sender, EventArgs e)
    {
        // process
    }

Я не понимаю почему; какие-нибудь мысли / помощь?

Если я не установил идентификатор для кнопки, то возникает событие щелчка, но в этом случае возникает новая проблема. Когда частичная обратная передача происходит на странице с помощью внешнего выпадающего списка для обновления radgrid, тогда моя настраиваемая кнопка экспорта отправляет обратные передачи асинхронно, тогда как должна выполнять полную обратную передачу.

Большое спасибо,

2 ответа

Решение

Я исправил это, добавив новый элемент управления в следующее событие:

 this.RadGrid.MasterTableView.Init += MasterTableViewInit;

 void MasterTableViewInit(object sender, EventArgs e)
    {
        if (!this.EnablePdfExport) return;

        var commandItem = this.RadGrid.MasterTableView.GetItems(GridItemType.CommandItem).SingleOrDefault();

        if (commandItem == null) return;

        AddPdfButton(commandItem as GridCommandItem);
    } 

Я с той же проблемой. Я проследил, чтобы Telerik переключил свойство Visible дочерних элементов управления RadGrid на false во время рендеринга. Это влияет только на частичные постбэки, потому что Render вызывается до того, как PageRequestManager пишет JavaScript для элементов управления обратной передачи, и пропускает элементы управления, которые не видны. Для полной обратной передачи (или начальной загрузки страницы) PageRequestManager записывает JavaScript для элементов управления обратной передачи перед отображением RadGrid, и, таким образом, элементы управления остаются видимыми.

Я не уверен, почему Telerik делает это, так как это вызывает множество проблем с использованием свойства Visible на этапе рендеринга.

Другие вопросы по тегам