Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从控制面板使RDLC使用日期格式_C#_Reporting Services_Rdlc_Reportviewer - Fatal编程技术网

C# 如何从控制面板使RDLC使用日期格式

C# 如何从控制面板使RDLC使用日期格式,c#,reporting-services,rdlc,reportviewer,C#,Reporting Services,Rdlc,Reportviewer,我的应用程序正在生成一些RDLC报告,其中包括一个日期字段。我想使用用户在区域和语言控制面板中的首选设置显示此日期字段(您可能认为这是默认行为,但显然不是) 报告文本框使用特定于语言环境的格式之一格式化为日期,在属性中显示为formatD 我的应用程序未更改线程.CurrentThread.CurrentCulture。在我自己的代码中运行DateTime.Now.ToString(“D”)时(在显示报告之前或之后),它的行为与我更改控制面板设置时预期的一样: 设置为“English(NZ)”

我的应用程序正在生成一些RDLC报告,其中包括一个日期字段。我想使用用户在区域和语言控制面板中的首选设置显示此日期字段(您可能认为这是默认行为,但显然不是)

报告文本框使用特定于语言环境的格式之一格式化为日期,在属性中显示为format
D

我的应用程序未更改
线程.CurrentThread.CurrentCulture
。在我自己的代码中运行
DateTime.Now.ToString(“D”)
时(在显示报告之前或之后),它的行为与我更改控制面板设置时预期的一样:

  • 设置为“English(NZ)”和默认的长日期格式,我将获得2020年10月16日星期五的
  • 设置为“English(NZ)”和备用长日期格式,我将获得2020年10月16日的
  • 设置为“French(France)”和默认的长日期格式,我将获得2020年10月16日的vendredi
  • 设置为“French(France)”和备用长日期格式,我将获得2020年10月16日的
然而,当我查看报告时,它总是以英语显示(无论选择哪个地区),尽管我确实获得了预期的默认或备用格式

仔细阅读后,我发现默认行为显然是不正确的,您必须显式地将报告语言设置为
=User!语言
,使其遵守语言设置(据称这使其使用了
CurrentCulture
)——但在这样做之后,它现在正确地遵循了语言,但无论控制面板设置如何,它都只使用默认格式,从不使用替代格式。这是一种改进,但仍然不正确

如何使报表查看器的行为与常规的.NET
ToString()
类似,并实际使用当前区域性?我不想在报告中硬编码任何特定的语言或格式


我目前使用的是
Microsoft.ReportingServices.ReportViewerControl.Winforms.150.1404.0.nupkg
好吧,这有点不好,但在微软修复他们的bug之前,我看不到任何替代方案

  • 确保报告不将语言设置为
    =User!语言
    (除非您想强制特定报告使用特定的非默认值,否则不要设置语言)
  • 将NuGet包添加到项目中。(下面的代码假设您使用的是1.2;在更高版本中,您可能需要稍微调整它。)
  • 添加以下类:
  • 在应用程序启动的早期调用ReportViewerBugFix.Patch()
  • (对于额外的偏执狂,您可以在调用
    Patch
    时捕获
    CultureInfo.CurrentCulture
    ,并返回该值,而不是稍后重新查询。不过,对于我尝试的所有案例,上述方法都是有效的。)


    这会将
    DefaultReportServerSpecificCulture
    的返回值更改为与
    ClientPrimaryCulture
    相同,因为在外部补丁中这样做比让
    EvaluateReportLanguage
    调用正确的东西更容易(这可能是更好的解决方案,可以访问代码)。但这没关系,因为您根本没有理由首先使用Windows UI语言。

    可能需要注意的是,默认情况下,WPF绑定具有相同的已知错误,尽管对于这些,您可以通过子类化
    Binding
    并将
    ConverterCulture
    显式设置为
    CurrentCulture
    来修复它。我不知道这里是否有类似的修复方法。在反汇编过程中,错误似乎是
    EvaluateReportLanguage
    调用
    Localization.DefaultReportServerSpecificCulture
    时,它应该使用
    Localization.ClientPrimaryCulture
    (或者只是将其保留为空). 但这并不能真正帮助我解决这个问题。
        public static class ReportViewerBugFix
        {
            public static void Patch()
            {
                HarmonyInstance.Create("fix.broken.microsoft.reportviewer").Patch(
                    AccessTools.Method("Microsoft.ReportingServices.Diagnostics.Localization,Microsoft.ReportViewer.Common:get_DefaultReportServerSpecificCulture"),
                    prefix: new HarmonyMethod(AccessTools.Method(typeof(ReportViewerBugFix), nameof(PatchDefaultReportServerSpecificCulture))));
            }
    
            private static bool PatchDefaultReportServerSpecificCulture(ref CultureInfo __result)
            {
                __result = CultureInfo.CurrentCulture;
                return false;
            }
        }