C# 如何从控制面板使RDLC使用日期格式
我的应用程序正在生成一些RDLC报告,其中包括一个日期字段。我想使用用户在区域和语言控制面板中的首选设置显示此日期字段(您可能认为这是默认行为,但显然不是) 报告文本框使用特定于语言环境的格式之一格式化为日期,在属性中显示为formatC# 如何从控制面板使RDLC使用日期格式,c#,reporting-services,rdlc,reportviewer,C#,Reporting Services,Rdlc,Reportviewer,我的应用程序正在生成一些RDLC报告,其中包括一个日期字段。我想使用用户在区域和语言控制面板中的首选设置显示此日期字段(您可能认为这是默认行为,但显然不是) 报告文本框使用特定于语言环境的格式之一格式化为日期,在属性中显示为formatD 我的应用程序未更改线程.CurrentThread.CurrentCulture。在我自己的代码中运行DateTime.Now.ToString(“D”)时(在显示报告之前或之后),它的行为与我更改控制面板设置时预期的一样: 设置为“English(NZ)”
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
)——但在这样做之后,它现在正确地遵循了语言,但无论控制面板设置如何,它都只使用默认格式,从不使用替代格式。这是一种改进,但仍然不正确
如何使报表查看器的行为与常规的.NETToString()
类似,并实际使用当前区域性?我不想在报告中硬编码任何特定的语言或格式
我目前使用的是
Microsoft.ReportingServices.ReportViewerControl.Winforms.150.1404.0.nupkg
好吧,这有点不好,但在微软修复他们的bug之前,我看不到任何替代方案
=User!语言
(除非您想强制特定报告使用特定的非默认值,否则不要设置语言)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;
}
}