我有一个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时,我的自定义导出按钮会异步发送回发,而它应该完全回发。
非常感谢,
答案 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属性导致很多问题。