This is a migrated thread and some comments may be shown as answers.

ItemCommand only raised in IE

1 Answer 55 Views
Grid
This is a migrated thread and some comments may be shown as answers.
golddog
Top achievements
Rank 1
golddog asked on 24 Oct 2011, 05:36 PM

Not exactly accurate, but telerik won't let me edit the title.

The grid is a list of documents the user has stored.  To view a stored document, I created the view link; within the ItemCommand event handler I create a file and stream it back to the user as shown below.  However, the javascript to open a window to facilitate the streaming never gets invoked (except in IE browsers).

This is in a user control, although I don't think that's important.  Here's the mark-up:

<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server">
    <script type="text/javascript">
        var mediaList = {};
 
        mediaList.get_AddDocumentModalUrl = function mediaList_getAddDocumentModalUrl() {
            return '<%= Page.ResolveClientUrl("~/MediaLibrary/Modals/AddDocument.aspx") %>';
        }
 
        mediaList.get_ViewDocumentModalUrl = function mediaList_getViewDocumentModalUrl(mimeType) {
            var url = '<%= Page.ResolveClientUrl("~/MediaLibrary/Modals/ViewDocument.aspx") %>' + '?type=' + mimeType;
            return url;
        }
 
        //On insert and update buttons click temporarily disables ajax to perform upload actions
        //for a more detailed description of why we need this.
        function conditionalPostback(sender, eventArgs) {
            var theRegexp = new RegExp("\.UpdateButton$|\.PerformInsertButton$", "ig");
            if (eventArgs.get_eventTarget().match(theRegexp)) {
                var upload = $find(window['UploadId']);
 
                //AJAX is disabled only if file is selected for upload (i.e., new documents)
                if (upload != null && upload.getFileInputs()[0].value != "") {
                    eventArgs.set_enableAjax(false);
                }
            }
        }
 
        function validateRadUpload(source, e) {
            e.IsValid = false;
 
            var upload = $find(source.parentNode.getElementsByTagName('div')[0].id);
            var inputs = upload.getFileInputs();
            for (var i = 0; i < inputs.length; i++) {
                //check for empty string or invalid extension
                if (inputs[i].value != "" && upload.isExtensionValid(inputs[i].value)) {
                    e.IsValid = true;
                    break;
                }
            }
        }
 
    </script>
</telerik:RadCodeBlock>
<telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
    <script type="text/javascript">
        mediaList.onAddDocumentWindowClosed = function mediaList.onAddDocumentWindowClosed(sender, eventArgs) {
            var returnValue = eventArgs.get_argument();
 
            if (!Utils.WasRadWindowCancelled(returnValue, true)) {
                __doPostBack('', '');
            }
        }
 
        mediaList.openAddDocumentWindow = function mediaList_openAddDocumentWindow() {
            Utils.OpenRadWindow
                (
                    mediaList.get_AddDocumentModalUrl(),
                    600,
                    400,
                    mediaList.onAddDocumentWindowClosed
                );
        }
 
        mediaList.openViewWindow = function mediaList_openViewWindow(mimeType) {
            document.getElementById("<%= streamFrame.ClientID %>").src = mediaList.get_ViewDocumentModalUrl(mimeType);
        }
    </script>
</telerik:RadScriptBlock>
<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" ClientEvents-OnRequestStart="conditionalPostback">
    <asp:Panel ID="pnlMsg" runat="server">
        <asp:Label ID="lblMsg" runat="server" Style="color: Red; font-weight: bold;" />
    </asp:Panel>
 
    <telerik:RadGrid ID="grdDocumentLibrary" runat="server" Skin="Default" AutoGenerateColumns="false"
        Width="100%" AllowPaging="true" PageSize="10" OnItemDataBound="grdDocumentLibrary_ItemDataBound"
        AllowAutomaticInserts="false" AllowAutomaticUpdates="false" OnEditCommand="grdDocumentLibrary_Edit"
        OnUpdateCommand="grdDocumentLibrary_Update" OnInsertCommand="grdDocumentLibrary_Insert"
        OnItemCommand="grdDocumentLibrary_ItemCommand" OnItemCreated="grdDocumentLibrary_ItemCreated"
        ShowStatusBar="true">
        <PagerStyle Mode="NumericPages" AlwaysVisible="false" Position="Bottom" CssClass="Pager" />
        <MasterTableView CommandItemDisplay="Top" ClientDataKeyNames="DocumentID" DataKeyNames="DocumentID">
            <NoRecordsTemplate>
                <asp:Label Text="No documents to display" runat="server" /></NoRecordsTemplate>
            <Columns>
                <telerik:GridEditCommandColumn ButtonType="ImageButton" UniqueName="EditColumn">
                </telerik:GridEditCommandColumn>
                <telerik:GridBoundColumn DataField="DocumentID" Visible="false" ReadOnly="true" UniqueName="DocID" />
                <telerik:GridTemplateColumn HeaderText="Document Name" UniqueName="DocName" ReadOnly="false">
                    <ItemTemplate>
                        <asp:Label ID="lblDocName" runat="server" Text='<%#Eval("Name") %>' />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <telerik:RadUpload ID="ruDocument" runat="server" MaxFileInputsCount="1" />
                        <asp:CustomValidator ID="cvDocument" runat="server" ClientValidationFunction="validateRadUpload"
                            ErrorMessage="Please select a file" Display="Dynamic" />
                    </EditItemTemplate>
                </telerik:GridTemplateColumn>
                <telerik:GridTemplateColumn HeaderText="Description" UniqueName="Description">
                    <ItemTemplate>
                        <asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>' />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <telerik:RadTextBox ID="txtDescription" runat="server" Text='<%# Bind("Description") %>'
                            Columns="50" Rows="5" TextMode="MultiLine" />
                        <des:RequiredTextValidator ID="rtvDescription" runat="server" ControlIDToEvaluate="txtDescription"
                            ErrorMessage="* Required" />
                    </EditItemTemplate>
                </telerik:GridTemplateColumn>
                <telerik:GridBoundColumn HeaderText="Date Created" DataField="CreatedDate" ReadOnly="true"
                    DataFormatString="{0:d}" />
                <telerik:GridBoundColumn HeaderText="Operator" DataField="CreatedBy" ReadOnly="true" />
                <telerik:GridImageColumn ImageUrl="~/Images/Tick.gif" HeaderText="Archived?" UniqueName="ArchivedColumn" />
                <telerik:GridTemplateColumn ReadOnly="true" UniqueName="ViewColumn">
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkView" runat="server" Text="View" CommandArgument='<%#Eval("DocumentID") %>' CommandName="View" />
                    </ItemTemplate>
                </telerik:GridTemplateColumn>
            </Columns>
            <EditFormSettings>
                <EditColumn ButtonType="PushButton" />
            </EditFormSettings>
        </MasterTableView>
    </telerik:RadGrid>
</telerik:RadAjaxPanel>
 
<telerik:RadAjaxLoadingPanel ID="loadingPanel" runat="server" Skin="Default" />
<telerik:RadAjaxManagerProxy ID="ajaxProxy" runat="server">
    <AjaxSettings>
        <telerik:AjaxSetting AjaxControlID="grdDocumentLibrary">
            <UpdatedControls>
                <telerik:AjaxUpdatedControl ControlID="grdDocumentLibrary" LoadingPanelID="loadingPanel" />
            </UpdatedControls>
        </telerik:AjaxSetting>
    </AjaxSettings>
</telerik:RadAjaxManagerProxy>
<iframe id="streamFrame" style="width: 1%; height: 1%" frameborder="0" scrolling="no"
    runat="server"></iframe>

And the ItemCreated event handler, where I set up the "View" link.

protected void grdDocumentLibrary_ItemCreated(object sender, GridItemEventArgs e)
{
    if (e.Item is GridDataItem)
    {
 
        LinkButton btn = (LinkButton)((GridDataItem)e.Item)["ViewColumn"].FindControl("lnkView");
        Page page = HttpContext.Current.CurrentHandler as Page;
        Telerik.Web.UI.RadAjaxManager ajaxMgr = Telerik.Web.UI.RadAjaxManager.GetCurrent(page);
        if (ajaxMgr != null)
        {
            ajaxMgr.AjaxSettings.AddAjaxSetting(btn, grdDocumentLibrary, loadingPanel);
        }
    }
}

And here's where I handle the ItemCommand:

protected void grdDocumentLibrary_ItemCommand(object sender, GridCommandEventArgs e)
 {
     if (e.CommandName == RadGrid.InitInsertCommandName)
     {
         e.Canceled = true;
         e.Item.OwnerTableView.InsertItem(new PartnerDocument());
     }
     else if (e.CommandName.Equals("View"))
     {
         BernardClientContext bcc = BuildClientContext();
         DocumentService ds = new DocumentService(new DocumentRepository(bcc));
         Document doc = ds.GetById(new Guid((string)e.CommandArgument));
 
         string filePath = System.Configuration.ConfigurationManager.AppSettings["GeneratedDocuments"];
         if (HttpContext.Current != null)
         {
             filePath = HttpContext.Current.Server.MapPath(filePath);
         }
 
         string fileName = null;
         Mutex fileMutex = null;
         try
         {
             while (true)
             {
                 fileName = doc.FileName + "_" + System.DateTime.Now.ToString("ddMMyyyyhhmmss") + doc.DocumentType.Name;
 
                 bool created;
                 fileMutex = new Mutex(true, fileName.Replace("\\", "_"), out created);
                 if (fileMutex != null && created)
                 {
                     if (!System.IO.File.Exists(filePath + fileName))
                         break;
 
                     fileMutex.ReleaseMutex();
                 }
 
                 System.Threading.Thread.Sleep(1000);
             }
 
             File.WriteAllBytes(filePath + fileName, doc.DocumentContent.Content);
 
             Page page = HttpContext.Current.CurrentHandler as Page;
             Telerik.Web.UI.RadAjaxManager ajaxMgr = Telerik.Web.UI.RadAjaxManager.GetCurrent(page);
             Session["documentToStream"] = filePath + fileName;
             if (ajaxMgr != null)
             {
                 ajaxMgr.ResponseScripts.Add(String.Format("mediaList.openViewWindow('{0}'); return false;", doc.MimeType));
             }
             else
             {
                 page.ClientScript.RegisterStartupScript(page.GetType(), "documentStream", String.Format("mediaList.openViewWindow('{0}'); return false;", doc.MimeType), true);
             }
 
         }
         finally
         {
             if (fileMutex != null)
                 fileMutex.ReleaseMutex();
         }
     }
 }


Thanks,

Scott

1 Answer, 1 is accepted

Sort by
0
golddog
Top achievements
Rank 1
answered on 24 Oct 2011, 09:45 PM
One of my co-workers found that splitting my javascript between RadCodeBlack and RadScriptBlock was the culprit.  Clearly, I need to read up on those.
Tags
Grid
Asked by
golddog
Top achievements
Rank 1
Answers by
golddog
Top achievements
Rank 1
Share this question
or