Hi all,
I have a number of grids in my project(s). In many cases it is neccessary/helpful for users to
- print the grids' content
- copy to clipbord (for further analysis in e.g. Excel)
- export data to a Excel readable file or PDF
I have set my sights on creating a user control containing a Radgrid (of course) and a toolbar of some sort which buttons can be enabled/disabled as needed (see attached mock-up picture where the toolbar replaces a pager's fuctionality plus has some tools). I have the feeling that this feature can be valuable to many users as it would provide a uniform approach to these common tasks.
I have be searching the forum for ideas and code snippets for my (dream) user control and I am stuck at the first stage. The print instructions in http://www.telerik.com/community/code-library/aspnet-ajax/grid/print-radgrid-contents.aspx do not work right out of the box (with or without skins).
I suspect that I am not the first one to have abovementioned need. Perhaps this functionality can already be found in some code library I have not stumbled on yet. But anyway... please point out to me the resources (complete code, snippets, problems) and might help me realize my user control.
Thank you!
10 Answers, 1 is accepted
The approach which you are trying to implement in you UserControl is applicable only when exporting to PDF. Could you please elaborate more on your scenario? Providing us with more detailed information on the issue which you are facing might help us to pinpoint the reason for the unwanted behavior. I would also ask you to send us a small runnable sample in order to investigate the issue locally. Additionally I would suggest you to use a pager template in order to customize the paging then using a toolbar. The following help article demonstrates how to achieve that.
Regards,
Kostadin
Telerik
In essense I am trying to make a reusable grid component (user control) I can use in my projects. Generally I would like to enable the users to export to common formats (Excel, PDF) for further work, storage or printing (hard copy). Furthermore I need to add, delete and edit records in the databases. All of these are included in your CommandItemSettings. As my working languge is not English I need to translate a few display texts (sorting, pager etc.) and keep those in my reusable grid component to circumvent code duplication and tedious work. And I need more custom functions in my component.
I have therefore concluded that a toolbar embedded within the grid would be the most flexible solution. I have found a few samples http://www.telerik.com/help/aspnet-ajax/grid-commanditem-default-behavior.html http://www.telerik.com/community/code-library/aspnet-ajax/general/export-radgrid-content-to-excel-word-csv-pdf-with-ajax-enabled.aspx
and below is my extraction from these samples. It contains a lowered toolbar with three buttons and a grid (without the language stuff). This is a regular ASPX (not the user control's ASCX).
The problem sofar is that I can not get ExportToExcel button to work. It removes the paging from the grid but does not produce any output. What is wrong?
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %><%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <style type="text/css"> .smallToolBar .rtbOuter { display: block !important; border: 0 !important; border-top: solid 1px rgb(197,197,197) !important; padding-bottom: 1px !important; } .smallToolBar .rtbMiddle { display: block !important; border: 0 !important; } .smallToolBar .rtbInner { padding: 0 !important; } .smallToolBar .rtbItem { margin: 0 3px 0 3px !important; height: 20px !important; } .smallToolBar .rtbWrap, .smallToolBar .rtbOut { height: 20px !important; width: 20px !important; } .smallToolBar .rtbIcon { padding: 0px 0px 2px 0px !important; } </style></head><body> <form id="form1" runat="server"> <div> <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" /> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" /> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" /> </Scripts> </telerik:RadScriptManager> <script type="text/javascript"> function onToolBarClientButtonClicking(sender, args) { var button = args.get_item(); switch (button.get_commandName()) { case "DeleteSelected": args.set_cancel(!confirm('Delete all selected customers?')); break; case "Export": args.EnableAjax = false; break; } } </script> <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="RadGrid1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadGrid1"></telerik:AjaxUpdatedControl> <telerik:AjaxUpdatedControl ControlID="Label1"></telerik:AjaxUpdatedControl> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings> </telerik:RadAjaxManager> <div> <asp:Label ID="Label1" runat="server" EnableViewState="False" Font-Bold="True" ForeColor="#FF8080"> </asp:Label> </div> <telerik:RadGrid ID="RadGrid1" runat="server" Width="97%" AutoGenerateColumns="true" AllowSorting="True" AllowAutomaticUpdates="true" AllowAutomaticDeletes="true" AllowMultiRowSelection="True" AllowMultiRowEdit="True" AllowPaging="True" PageSize="7" GridLines="None" DataSourceID="SqlDataSource1" HorizontalAlign="NotSet" OnItemCreated="RadGrid1_ItemCreated" OnItemDeleted="RadGrid1_ItemDeleted" OnItemUpdated="RadGrid1_ItemUpdated" OnItemInserted="RadGrid1_ItemInserted" > <PagerStyle Mode="NextPrevAndNumeric"></PagerStyle> <MasterTableView Width="100%" GridLines="None" CommandItemDisplay="Top" DataSourceID="SqlDataSource1" EditMode="InPlace" HorizontalAlign="NotSet" DataKeyNames="CustomerID" AllowAutomaticInserts="True"> <CommandItemTemplate> <telerik:RadToolBar ID="RadToolBar1" runat="server" CssClass="smallToolBar" OnClientButtonClicking="onToolBarClientButtonClicking" AutoPostBack="true"> <Items> <telerik:RadToolBarButton Tooltip="Add new" Text="" CommandName="InitInsert" ImageUrl="~/Images/add.ico" Visible='<%# Not RadGrid1.MasterTableView.IsItemInserted %>'> </telerik:RadToolBarButton> <telerik:RadToolBarButton Tooltip="Add this Customer" Text="" CommandName="PerformInsert" ImageUrl="~/Images/insert.ico" Visible='<%# RadGrid1.MasterTableView.IsItemInserted %>'> </telerik:RadToolBarButton> <telerik:RadToolBarButton Tooltip="Export to Excel" Text="" CommandName="Export" ImageUrl="~/Images/excel.ico"> </telerik:RadToolBarButton> </Items> </telerik:RadToolBar> </CommandItemTemplate> </MasterTableView> <ClientSettings> <Selecting AllowRowSelect="True" EnableDragToSelectRows="True"></Selecting> </ClientSettings> <ExportSettings exportonlydata="True" ignorepaging="True" openinnewwindow="True"> <Pdf PageTitle="" PaperSize="A4" allowcopy="True" PageBottomMargin="20mm" PageTopMargin="20mm" PageLeftMargin="20mm" PageRightMargin="20mm" /> <Excel Format="ExcelML" /> </ExportSettings> </telerik:RadGrid> <asp:AccessDataSource runat="server" ID="SqlDataSource1" DataFile="~/App_LocalResources/Nwind.mdb" DeleteCommand="DELETE FROM [Customers] WHERE [CustomerID] = @CustomerID" InsertCommand="INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle]) VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle)" SelectCommand="SELECT [CustomerID], [CompanyName], [ContactName], [ContactTitle] FROM [Customers]" UpdateCommand="UPDATE [Customers] SET [CompanyName] = @CompanyName, [ContactName] = @ContactName, [ContactTitle] = @ContactTitle WHERE [CustomerID] = @CustomerID"> <DeleteParameters> <asp:Parameter Name="CustomerID" Type="String"></asp:Parameter> </DeleteParameters> <InsertParameters> <asp:Parameter Name="CustomerID" Type="String"></asp:Parameter> <asp:Parameter Name="CompanyName" Type="String"></asp:Parameter> <asp:Parameter Name="ContactName" Type="String"></asp:Parameter> <asp:Parameter Name="ContactTitle" Type="String"></asp:Parameter> </InsertParameters> <UpdateParameters> <asp:Parameter Name="CompanyName" Type="String"></asp:Parameter> <asp:Parameter Name="ContactName" Type="String"></asp:Parameter> <asp:Parameter Name="ContactTitle" Type="String"></asp:Parameter> <asp:Parameter Name="CustomerID" Type="String"></asp:Parameter> </UpdateParameters> </asp:AccessDataSource> </div> </form></body></html>Imports Telerik.Web.UIImports System.DrawingPartial Class Default2 Inherits System.Web.UI.Page Protected Sub RadGrid1_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs) TryCast(RadGrid1.MasterTableView.AutoGeneratedColumns(0), GridBoundColumn).MaxLength = 5 Dim item As GridEditableItem = TryCast(e.Item, GridEditableItem) If item IsNot Nothing AndAlso e.Item.IsInEditMode AndAlso e.Item.ItemIndex <> -1 Then TryCast(item.EditManager.GetColumnEditor("CustomerID").ContainerControl.Controls(0), TextBox).Enabled = False End If End Sub Protected Sub RadGrid1_ItemDeleted(ByVal source As Object, ByVal e As Telerik.Web.UI.GridDeletedEventArgs) Handles RadGrid1.ItemDeleted If Not e.Exception Is Nothing Then e.ExceptionHandled = True DisplayMessage(True, "Customer " + e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("CustomerID").ToString() + " cannot be deleted.") Else DisplayMessage(False, "Customer " + e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("CustomerID").ToString() + " deleted") End If End Sub Protected Sub RadGrid1_ItemUpdated(ByVal source As Object, ByVal e As Telerik.Web.UI.GridUpdatedEventArgs) Handles RadGrid1.ItemUpdated If Not e.Exception Is Nothing Then e.KeepInEditMode = True e.ExceptionHandled = True DisplayMessage(True, "Customer " + e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("CustomerID").ToString() + " cannot be updated due to invalid data.") Else DisplayMessage(False, "Customer " + e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("CustomerID").ToString() + " updated") End If End Sub Protected Sub RadGrid1_ItemInserted(ByVal source As Object, ByVal e As Telerik.Web.UI.GridInsertedEventArgs) Handles RadGrid1.ItemInserted If Not e.Exception Is Nothing Then e.ExceptionHandled = True e.KeepInInsertMode = True DisplayMessage(True, "Customer cannot be inserted due to invalid data.") Else DisplayMessage(False, "Customer inserted") End If End Sub Protected Sub RadGrid1_ItemCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RadGrid1.ItemCommand Select Case e.CommandName Case "DeleteSelected" If RadGrid1.SelectedIndexes.Count <> 0 Then For Each item As GridDataItem In RadGrid1.SelectedItems e.Item.OwnerTableView.PerformDelete(item, True) Next e.Item.OwnerTableView.Rebind() End If Case "Export" RadGrid1.MasterTableView.ExportToExcel() End Select End Sub Private Sub DisplayMessage(ByVal isError As Boolean, ByVal text As String) Me.Label1.Font.Bold = True Me.Label1.Visible = True If (isError) Then Me.Label1.ForeColor = Color.Red Else Me.Label1.ForeColor = Color.Green End If Me.Label1.Text = text End SubEnd ClassNote that the export feature works only with a regular postback and you have to disable the ajax before exporting the grid. Additional information and available solutions could be found at the following help article, under Export from AJAX-enabled RadGrid section.
I hope this information proves helpful.
Regards,
Kostadin
Telerik
In my source code above I have this script:
function onToolBarClientButtonClicking(sender, args) { var button = args.get_item(); switch (button.get_commandName()) { case "DeleteSelected": args.set_cancel(!confirm('Delete all selected customers?')); break; case "Export": args.EnableAjax = false; break; }}On the server-side I receive the ItemCommand event with CommandName="Export" so ExportToExcel is called.
Protected Sub RadGrid1_ItemCommand(ByVal source As Object, _ ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RadGrid1.ItemCommand Select Case e.CommandName Case "DeleteSelected" If RadGrid1.SelectedIndexes.Count <> 0 Then For Each item As GridDataItem In RadGrid1.SelectedItems e.Item.OwnerTableView.PerformDelete(item, True) Next e.Item.OwnerTableView.Rebind() End If Case "Export" RadGrid1.MasterTableView.ExportToExcel() End SelectEnd SubSo clicking the Export button on the grid's embedded toolbar results in
- the grid is refreshed without the toolbar
- the grid is without paging
- I get no Excel document
What am I missing?
As you have twice referred to me the same article (Export from AJAX-enabled RadGrid) I want to underline what I am trying to do. Please look at the attached picture (similar to the one in my first post). I need grid with a toolbar (or closely associated to a grid) similar to Telerik's implementation of "commandbar" (CommandItemDisplay="top"). I need to add my own commands / shortcuts as normally on toolbars. And I would like to place the grid's title to the left on this toolbar.
Posting some code to reproduce the functionality of your "commandbar" would help.
In order to disable the ajax you have to wire the OnRequestStart event of the ajax manager, determine whether the target control is ajaxified and explicitly disable its ajax mode to export with regular postback.
function onRequestStart(sender, args) { if (args.get_eventTarget().indexOf("ExportButtonID") >= 0) args.set_enableAjax(false);}As to the question related with the CommandItemTemplate you could check out the following live example.
Regards,
Kostadin
Telerik
I still do not get it.
Clicking the Export button on the grid's embedded toolbar results in
- On the client side: onToolBarClientButtonClicking is called, onRequestStart is NOT
- On the server side: RadGrid1_ItemCommand is called
- the grid is refreshed without the toolbar and without paging
- I get no Excel document
Please CORRECT my runnable source below to get export to work by clicking the toolbar button.
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default4.aspx.vb" Inherits="Default4" %><%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %><!DOCTYPE><html><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <div> <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" /> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" /> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" /> </Scripts> </telerik:RadScriptManager> <script type="text/javascript"> function onToolBarClientButtonClicking(sender, args) { var button = args.get_item(); var nam = args.get_item().get_commandName(); switch (nam) { case "ExportExcel": alert("onToolBarClientButtonClicking: args.EnableAjax = false"); args.EnableAjax = false; break; } } function onRequestStart(sender, args) { if (args.get_eventTarget().indexOf("Export") >= 0) { alert("onRequestStart: args.EnableAjax = false"); args.set_enableAjax(false); } } </script> <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> <ClientEvents OnRequestStart="onRequestStart"></ClientEvents> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="RadGrid1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadGrid1"></telerik:AjaxUpdatedControl> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings> </telerik:RadAjaxManager> <telerik:RadGrid ID="RadGrid1" runat="server" Width="97%" AllowPaging="True" PageSize="7" DataSourceID="SqlDataSource1"> <MasterTableView Width="100%" CommandItemDisplay="top"> <CommandItemTemplate> <telerik:RadToolBar ID="RadToolBar1" runat="server" OnClientButtonClicking="onToolBarClientButtonClicking" AutoPostBack="true"> <Items> <telerik:RadToolBarButton Tooltip="Export to Excel" CommandName="ExportExcel" Text="Export"> </telerik:RadToolBarButton> </Items> </telerik:RadToolBar> </CommandItemTemplate> </MasterTableView> <ExportSettings exportonlydata="True" ignorepaging="True" openinnewwindow="True"> <Excel Format="ExcelML" /> </ExportSettings> </telerik:RadGrid> <asp:AccessDataSource runat="server" ID="SqlDataSource1" DataFile="~/App_LocalResources/Nwind.mdb" SelectCommand="SELECT [CustomerID], [CompanyName], [ContactName], [ContactTitle] FROM [Customers]" > </asp:AccessDataSource> </div> </form></body></html>CODE BEHIND:Imports Telerik.Web.UIImports System.DrawingPartial Class Default4 Inherits System.Web.UI.Page Protected Sub RadGrid1_ItemCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RadGrid1.ItemCommand Select Case e.CommandName Case "ExportExcel" RadGrid1.MasterTableView.ExportToExcel() End Select End SubEnd ClassThanks in advance.
If you debugged your sample you will noticed that the event target is not the RadToolBarButton, but it is the RadToolBar itself. So you could use the following code snippet.
function onRequestStart(sender, args) { if (args.get_eventTarget().indexOf("RadToolBar1") >= 0) { alert("onRequestStart: args.EnableAjax = false"); args.set_enableAjax(false); } }Keep in mind that no matter which button you clicked inside the ToolBar the ajax will be disabled. If you want to disable the ajax only when you click the export button then you could use the following approach.
JavaScript:
<script type="text/javascript"> function disableAjax(sender, args) { if (args.get_item().get_commandName() == "ExportExcel") { var ajaxPanel = $find("<%= RadAjaxManager1.ClientID %>"); ajaxPanel.set_enableAJAX(false) } }</script><CommandItemTemplate> <telerik:RadToolBar ID="RadToolBar1" runat="server" OnClientButtonClicked="disableAjax" AutoPostBack="true"> <Items> <telerik:RadToolBarButton ToolTip="Export to Excel" CommandName="ExportExcel" Text="Export"> </telerik:RadToolBarButton> </Items> </telerik:RadToolBar> </CommandItemTemplate>Additionally I prepared a small sample based on the provided code and attached it to this forum thread.
Regards,
Kostadin
Telerik
Hello,
I am just getting started with Telerik. But I wanted to do exactly as the original post - I wanted to have these generic types of features for all of my grids. I was wondering what is the recommended approach? Is it a user control or a custom grid (inheriting from RadGrid). I was just wanted to get the most reuse and conformity as possible.
Thanks in advance.
It depends whether you need to modify only the grid or you want to use another controls with it. For the first case you can create a custom class which inherits RadGrid and for the second scenario is suitable to use a UserControl. Keep in mind that both approaches are valid so it depends on your scenario.
Regards,
Kostadin
Telerik
See What's Next in App Development. Register for TelerikNEXT.