我有一个继承RadGrid
的简单类。我正在向RadGrid添加一个按钮,并为该按钮添加一个Click事件处理程序。该按钮已正确添加到所需位置,并且单击事件处理程序正在触发,但radGrid.ExportToExcel()
没有执行任何操作。事实上,点击后,当页面回发时,按钮消失。为什么会这样?
我尝试将按钮控件添加到Page.Form
控件集合中,但仍然没有任何反应。
[ToolboxData("<{0}:RadGridDp runat=server></{0}:RadGridDp>")]
public class RadGridDP : RadGrid
{
public RadGridDP()
{
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Button btnExport = new Button();
btnExport.ID = "Export";
btnExport.Text = "Export";
btnExport.Click += new EventHandler(btnExport_Click);
btnExport.CommandArgument = this.ID;
this.MasterTableView.Controls.Add(btnExport);
}
void btnExport_Click(object sender, EventArgs e)
{
Button btnExport = (Button)sender;
string RadGridId = btnExport.CommandArgument.ToString();
RadGridDP radGrid = (RadGridDP)this.Parent.Parent.FindControl(RadGridId);
radGrid.ExportSettings.IgnorePaging = true;
radGrid.ExportSettings.OpenInNewWindow = true;
radGrid.ExportSettings.ExportOnlyData = true;
radGrid.MasterTableView.ExportToExcel();
}
}
当我在UserControl
中执行相同操作并在任何页面上使用UserControl
时,它可以正常工作。有什么区别?
答案 0 :(得分:1)
我找到了解决方案。每当RadGrid加载时,它就会以这种方式调用各种事件:
1. Page OnLoad
m. RadGrid OnLoad
x. NeedDataSource
并且在单击按钮(以上面的方式添加)时,以这种方式调用事件
1. Page_OnLoad
m. RadGrid OnLoad
n. btnExport_Click
x. NeedDataSource
(对于奇怪的序列号,这些事件之间可能还有其他事件,但是出现的顺序是正确的) 因此,整个Grid随着数据反弹,因此exportPdf的命令被刷新。没有任何反应。 有趣的是,没有必要添加一个额外的按钮,telerik提供了自己的按钮来执行此操作。也可以定制(通过实施ITemplate)。这就是现在生成报告的方式(虽然不是特定于原始问题):
[ToolboxData("<{0}:RadGridDP runat=server></{0}:RadGridDP>")]
public class RadGridDP : RadGrid
{
//custom logic
public RadGridDP()
{
this.ItemCreated += new GridItemEventHandler(RadGrid_ItemCreated);
this.Load += new EventHandler(RadGridDP_Load);
this.ItemCommand += new GridCommandEventHandler(RadGrid_ItemCommand);
this.PdfExporting += new OnGridPdfExportingEventHandler(RadGridDP_PdfExporting);
this.GridExporting += new OnGridExportingEventHandler(RadGridDP_GridExporting);
this.ExportSettings.ExportOnlyData = true;
this.ExportSettings.IgnorePaging = true;
// this.ExportSettings.OpenInNewWindow = true;
DoPdfFormatting();
DoExcelFormatting();
}
protected void RadGridDP_PdfExporting(object sender, GridPdfExportingArgs e)
{
e.RawHTML = e.RawHTML.Replace("border=\"1\"", "").Replace("style=\"", "style=\" border:0.5px Solid black; ")
.Replace("<thead>", String.Format("<thead>{0}", TableHeader)).Replace("</tbody>", String.Format("{0}</tbody>", TableFooter));
}
protected void RadGridDP_GridExporting(object sender, GridExportingArgs e)
{
e.ExportOutput = e.ExportOutput.Replace("<thead>", String.Format("<thead>{0}", TableHeader))
.Replace("</tbody>", String.Format("{0}</tbody>", TableFooter));
}
}
所以基本上我必须处理PdfExporting(对于Pdf)和GridExporting(对于excel).. 我还必须处理Load,ItemCommand和ItemCreated。虽然前者是某些条件逻辑所必需的,但后来需要两个才能格式化PDF文档