3

我们使用 Telerik RadGrid 2.0.2.0 的 ASP.NET Web 应用程序需要更新以兼容 Windows 7。问题是导出 Excel 文件的现有功能无法生成与 Office 2007 兼容的 Excel 文件,Office 2007 是我们新的 Windows 7 通用应用程序集的一部分。

问题在于这些代码行:

ExportXLS.Telerik.WebControls.RadGrid RadGrid1 = new
       ExportXLS.Telerik.WebControls.RadGrid();
RadGrid1.MasterTableView.ExportToExcel(TableName, true, false);

我们发现还有另一个 dll,RadGrid.Net2 版本 4.5.0.0,其中包含 2.0 版本的 dll 中不可用的“ExportToExcel2007”方法。此方法确实会生成可以使用 Excel 2007 打开的有效 Excel 文件。

Telerik.WebControls.RadGrid RadGrid1 = new Telerik.WebControls.RadGrid();
RadGrid1.MasterTableView.ExportToExcel2007(TableName, true, false);

问题是这两个 dll 之间似乎存在巨大差异,并且切换到使用新的 dll 看起来并不容易。我们预期的解决方案是在应用程序中引用这两个 dll,但仅在创建 2007 兼容 Excel 文件时出现问题的屏幕中使用较新的 dll。

使用以下文章作为指南,

http://blogs.msdn.com/b/ansonh/archive/2006/09/28/extern-alias-walkthrough.aspx

我们做了以下小改动:

  1. 在 web 项目中添加了对“RadGrid.Net2.dll”的引用,并将该引用的别名属性调整为“ ExportXLS

  2. 将此添加到 ExportExcel.aspx.cs 代码隐藏页面的顶部:

    外部别名ExportXLS ;

  3. 然后,通过引用 radgrid.net2.dll 的限定引用,使用新的 dll 实例化一个 radgrid:

    ExportXLS .Telerik.WebControls.RadGrid RadGrid1 = new ExportXLS .Telerik.WebControls.RadGrid();

  4. 修改 ExportToExcel 方法以使用 2007 对应方法:

    RadGrid1.MasterTableView。ExportToExcel2007(表名,真,假);

这解决了 ExportExcel.aspx 页面的问题,并且屏幕现在生成了与 Excel 2007 兼容的 Excel 电子表格,但是,我们惊讶地发现此更改破坏了使用 RadGrid 的应用程序中的其他页面。这是错误:

    c:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\7ff38b9a\2680aee3\App_Web_systemmapsearch.ascx.a97e7c59.tlmhafnf.0.cs(251): error CS0433: 

The type 'Telerik.WebControls.GridRowIndicatorColumn' 
exists in both 
    'c:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET 
    Files\root\7ff38b9a\2680aee3\assembly\dl3\cd8ec314\002177c0_d2e8cb01\RadGrid.DLL' 
and 
    'c:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\7ff38b9a\2680aee3\assembly\dl3\428a2b2d\002177c0_d2e8cb01\RadGrid.Net2.DLL'

我的期望是其他网页将继续使用不合格的旧 2.0.2.0 版本的 RadGrid.dll 并继续工作,但事实并非如此。

以下是用户控件 SystemMapSearch.ascx 后面的代码中的一些代码,该代码无法加载:

<%@ Register TagPrefix="radG" Namespace="Telerik.WebControls" Assembly="RadGrid" %>
<radg:radgrid id="RadGrid1" cssclass="RadGrid" runat="server" allowpaging="True" allowsorting="True" gridlines="none"
        pagesize="20" width="100%" borderwidth="0" AutoGenerateColumns="False">

我试图更改 NameSpace 指令以包含全局命名空间,但这会导致引用无效:

<%@ Register TagPrefix="radG" Namespace="global::Telerik.WebControls" Assembly="RadGrid" %>

为什么更改 ExportExcel.aspx 页面会破坏其他页面,我该怎么做才能解决此问题?

4

4 回答 4

3

嗨,也许这些东西可以帮助您解决问题。

  • 出于某种原因,您的应用程序加载了两个不同版本的 Telerik.Web.UI 程序集。这可能是因为您在 GAC 中有两个 Telerik.Web.UI 程序集。

    解决此问题,您可以检查您的项目并确保无论您在何处引用 Telerik.Web.UI 程序集(在 web.config 或 ASPX 页面中),您使用的是完全限定的程序集名称。例如:

    “Telerik.Web.UI,版本=2009.2.701.20,文化=中性,PublicKeyToken=121fae78165ba3d4”

    而不仅仅是“Telerik.Web.UI”。完全限定名称包括版本号,因此 ASP.NET 不会混淆为同时加载两个程序集。参考:编译错误消息:“Telerik.Web.UI.RadFileExplorer”类型存在于两者中。

  • 将现有的 Telerik RadControls 应用程序(包括 RadChart)升级到 RadControls for ASP.NET AJAX 时,您可能会收到以下错误:

    错误 1 ​​类型为“Telerik.Charting. 存在于 'c:\WINDOWS\assembly\GAC_MSIL\Telerik.Charting...\Telerik.Charting.dll' 和 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files.. .\RadChart.Net2.DLL'

    这个错误的原因是因为 RadChart(3.x 和更高版本)和 RadControls for ASP.NET AJAX Chart 使用共享代码。他共享代码是 Telerik.Charting.dll 程序集的形式出于向后兼容性的原因,已在 RadChart.Net2.dll 中进行了 ILM 合并,并为 RadControls for ASP.NET AJAX 单独提供。每当您尝试同时引用 RadChart.Net2.dll 和 Telerik.Charting.dll 时,该错误就会显现出来。

    有两种方法可以解决该问题:

    1. 如果您正在迁移项目以使用 RadControls for ASP.NET AJAX,您最初可能希望从 Web.config 文件中删除对 Telerik.Charting.dll 的引用。在这种情况下,您将使用旧的 ASP.NET 图表,并且不需要套件附带的 Telerik.Charting.dll。Telerik.Charting.dll 不是 Chart 以外的 ASP.NET AJAX 控件的操作所必需的。

    2. 如果您已经在使用 RadChart for ASP.NET AJAX,那么您需要删除对 RadChart.Net2.dll 的引用并继续使用 Telerik.Charting.dll

    请记住,用于 ASP.NET AJAX 的 RadChart 和 RadChart 4.x 具有 99% 的相同功能。取决于您的个人喜好来决定您想使用哪一个。最显着的区别是程序集名称以及 RadChart for ASP.NET AJAX 使用 HttpHandler 来显示图像,而 RadChart 4.x 出于向后兼容性的原因仍然使用 RadControls\Image.aspx。参考:Telerik.Charting。Telerik.Charting.dll 和 RadChart.Net2.dll

  • 这是一个通用错误,通常意味着您引用的程序集与实际使用的程序集不匹配。很可能您有并行报告安装和不匹配的参考。请使用升级向导升级包含 Telerik 报告的项目并重建它们。如果您添加了手动引用,即 Copy Local = True,则从 \bin 文件夹中删除所有程序集,在项目中重新添加正确的引用,然后重建项目。如果问题仍然存在,请确保您已在每个引用中指定了完整的程序集限定名称。例如:

    <%@ Register assembly="Telerik.ReportViewer.WebForms, Version=5.0.11.328, Culture=neutral, PublicKeyToken=a9d7983dfcc261be" namespace="Telerik.ReportViewer.WebForms" tagprefix="telerik" %>

    而不是:

    <%@ Register TagPrefix="telerik" Assembly="Telerik.ReportViewer.WebForms" Namespace="Telerik.ReportViewer.WebForms" %>
    参考:Telerik.Reporting.Report 存在于两者中......

  • 将 batch="false" 属性添加到 web.config 文件的“编译”元素。

    出现此问题的原因是 ASP.NET 2.0 使用应用程序引用和应用程序的文件夹结构来编译应用程序的方式。如果应用程序的 web.config 文件中元素的批处理属性设置为 true,则 ASP.NET 2.0 会将应用程序中的每个文件夹编译成一个单独的程序集。
    参考:ASP.Net 错误:“类型 'foo' 存在于“temp1.dll”和“temp2.​​dll ”中

于 2013-02-07T07:40:46.840 回答
2

我在我从事的一个旧项目中遇到了类似的问题。

我知道删除临时文件可以解决问题,因为我们能够编译和部署 Web 应用程序(每个功能都按预期工作)。

我没有深入研究为什么会出现这种错误。

于 2013-02-03T23:01:32.727 回答
1

我实际上从未这样做过,但我相信您可以为新的 Telerik dll 编写一个包装器 dll,只公开所需的功能,然后在您的项目中引用该包装器。

于 2013-02-04T20:43:46.907 回答
1

我更改了所有出现的程序集“Radgrid”

<%@ Register TagPrefix="radG" Namespace="global::Telerik.WebControls" Assembly="RadGrid" %>

<%@ Register TagPrefix="radG" Namespace="global::Telerik.WebControls" Assembly="RadGrid.Net2" %>

我认为,在我进行此更改之前,即使我不再引用旧的 radgrid.dll,它仍然会在 bin 文件夹中拾取旧的 radgrid.dll。

无论如何,当我小心地改变了所有出现的 Assembly 属性,甚至从 bin 文件夹中删除了旧的未使用的 dll 时,它就起作用了。

于 2013-02-07T16:18:08.157 回答