【问题标题】:A Partial Post Back causes the Full Post Back buttons to act as Partial Post Back, why?部分回发导致完整回发按钮充当部分回发,为什么?
【发布时间】:2011-07-26 15:25:10
【问题描述】:

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

我需要向 RadGrid 的 CommandItem 部分添加一个新按钮。按钮必须支持完全回发。

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 时,我的自定义导出按钮会异步发送回发,而它应该完全回发。

非常感谢,

【问题讨论】:

    标签: button updatepanel postback radgrid


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 2023-03-31
        • 2011-03-02
        相关资源
        最近更新 更多