Partial Post Back导致Full Post Back按钮充当部分回发,为什么?

时间:2011-07-26 15:25:11

标签: button updatepanel postback radgrid

我有一个RadGrid控件,它在page_init上动态创建,并添加到页面上updatePanel内的占位符。

我需要在RadGrid的CommandItem部分添加一个新Button。该按钮必须支持完整的回发。

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;
    }

要注册此控件的回发事件,我使用了ScriptManager的RegisterPostBackControl()方法。

 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
    }

我不明白为什么;任何想法/帮助?

如果我没有为按钮设置ID,则会引发click事件,但在这种情况下会出现新问题。当通过外部下拉列表在页面上发生部分回发以更新radgrid时,我的自定义导出按钮会异步发送回发,而它应该完全回发。

非常感谢,

2 个答案:

答案 0 :(得分:0)

我通过在以下事件中添加新控件来修复它:

 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);
    } 

答案 1 :(得分:0)

我遇到了同样的问题。我已将其跟踪到Telerik,在渲染期间将RadGrid的子控件的Visible属性切换为false。这只会影响部分页面回发,因为在PageRequestManager为回发控件编写JavaScript之前会调用Render,并且它会跳过不可见的控件。对于完整的回发(或初始页面加载),PageRequestManager在渲染RadGrid之前为回发控件编写JavaScript,因此控件仍然是可见的。

我不确定为什么Telerik会这样做,因为它会在渲染阶段使用Visible属性导致很多问题。