2017-08-15 84 views
0

我使用的是Telerik的radgrid控件查看數據AJAX填充image列。其中一列的是一個GridTemplateColumn其包括由一個AJAX調用當電網負載給定的圖像源的元件。Telerik的radgrid控件出口包括

我的問題是,當我這個網格導出到Excel/PDF/Word中,圖像欄爲空白。有沒有人遇到這樣的情況?

+0

從我的理解來看,這不支持每個Telerik的開箱即用。在他們的論壇中有一個代碼片段顯示瞭如何在導出時操縱網格以使其能夠以PDF/Word正確顯示(我不相信Excel會在單元格中顯示圖像,無論您做什麼),但是我有現在很難找到它。如果我再次遇到它,我會在這裏發佈一個鏈接。 – chambo

回答

0

於是我找到了解決這個問題。

在您的網格中,使用GridBinaryImageColumn作爲圖像。

<telerik:GridBinaryImageColumn 
    UniqueName="ImageColumnBin" 
    HeaderText="Image" 
    Exportable="true" 
    AlternateText="Image" 
    DefaultImageUrl="/images/Default.jpg" /> 

當您使用此列時,您可以從客戶端或服務器端插入圖像。所以,當電網呈現在頁面上,我用從電網發起一個Ajax調用OnRowCreated客戶端的方法。

<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"> 
    <script> 
     OnRowCreated: function getBinaryImage(sender, args) { 
         var dataItem = args.get_gridDataItem(); 
         var html = dataItem.get_cell("ImageColumnBin").innerHTML; 

         var jqhtml = $($.parseHTML(html.trim())); 
         var imgID = jqhtml.attr('id'); 
         var pkey = args.getDataKeyValue('Key'); 

         $.ajax({ 
           type: 'POST', 
           url: 'ResultWindow.aspx/GetBinaryImage', 
           data: '{ImageKey: ' + pkey + '}', 
           contentType: "application/json; charset=utf-8", 
           dataType: "json", 
           success: function (r) {$('#' + imgID).attr('src', r.d);}, 
           error: function (request, error) {console.log("Error: " + request);} 
           }); 
          } 
    </script> 
</telerik:RadCodeBlock> 

所以每次在客戶端創建一行時,這個ajax調用會加載這些圖片。如果您有500條記錄,但只顯示10行,則只需加載10張圖像。

現在,我們在這個網格的出口需要這些圖像。在服務器端,在網格的ItemDataBound中,檢查網格IsExporting。如果這是真的,那麼我們可以假設用戶已經開始導出。因此,對於每個綁定的項目,我們可以查找圖像並將其分配給二進制圖像列。

protected void RadGrid_ItemDataBound(object sender, GridItemEventArgs e) 
    { 
     if (e.Item is GridDataItem && !e.Item.IsInEditMode) 
     { 
      GridDataItem dataBoundItem = e.Item as GridDataItem; 
      if (RadGrid.IsExporting 
       && RadGrid.MasterTableView.GetColumnSafe("ImageColumnBin") != null 
       && RadGrid.MasterTableView.GetColumnSafe("ImageColumnBin").Display) 
      { 
        (dataBoundItem["ImageColumnBin"].Controls[0] as RadBinaryImage).DataValue = GetBinaryImage(dataBoundItem.GetDataKeyValue("Key").ToString()); 
      } 
     } 
    } 

此解決方案對我來說最合適。現在,我在網格中加載了延遲加載的圖像,並且在導出此網格時,我擁有完整的圖像集。