我们使用的RadGridView有145000行和4列。我们使用复制粘贴来从其他应用程序和Telerik构建的应用程序中移动数据。
当我们复制一个平面文件(用制表符分隔字段)并将其粘贴到RadGridView时,整个过程非常缓慢。从剪贴板中检索数据的函数需要几分钟(可能需要几个小时,我取消了它)。它追踪到StringTokenizer类的原因。标记器将字符串分割为单独的字段。但是在提取一个字段之后,它会创建一个新的字符串副本(包含大约10MB的数据)减去该字段。我修补了它(与HarmonyX),现在只需要一秒钟:
静态类StringTokenizerPerformancePatch{静态私人只读的InstanceFieldAccessor<StringTokenizer,LinkedList<字符串> > _tokens=新InstanceFieldAccessor< StringTokenizer, LinkedList<字符串> > (“令牌”);静态私人只读的InstanceFieldAccessor<StringTokenizer,字符串> _sourceString=新InstanceFieldAccessor < StringTokenizer,字符串>(“sourceString”);静态私人只读的InstanceFieldAccessor<StringTokenizer,字符串> _delimiter=新InstanceFieldAccessor < StringTokenizer,字符串>(“分隔符”);静态私人只读的InstanceFieldAccessor<StringTokenizer,IEnumerator<字符串> > _enumerator=新InstanceFieldAccessor < StringTokenizer, IEnumerator <字符串> > (“计数器”);[HarmonyPatch (typeof (StringTokenizer),“标记”)]静态类Patch_StringTokenizer_Tokenize{静态保龄球前缀(StringTokenizer __instance){vartokens = _tokens.GetValue(__instance);varsourceString = _sourceString.GetValue(__instance);vardelimiter = _delimiter.GetValue(__instance);Tokenize(标记,sourceString,分隔符);_enumerator。SetValue (__instance tokens.GetEnumerator ());返回假;}静态私人无效标记(LinkedList <字符串>标记,字符串文本,字符串分隔符){tokens.Clear ();如果(字符串.IsNullOrEmpty(文本)返回;int指数=0;而(真正的){varIndex2 = text。IndexOf(分隔符,索引,stringcompare . ordinal);如果(index2 <0) {tokens.AddLast(text.Substring(index));打破;}字符串Token =文本。子字符串(index, index2 - index); tokens.AddLast(token); index = index2 + delimiter.Length; } } } }
请更新您的tokanizer以提高性能。当你这样做的时候:使用下面的代码。
1.单击第一个按钮插入链接。
2.单击链接内部以移动光标。
3.单击第二个按钮插入黄色矩形
4.单击第三个按钮导出HTML内容。
实际结果:StackOverflow异常
私人无效radButton1_Click(对象发件人,EventArgs e){HyperlinkInfo info =新HyperlinkInfo() {NavigateUri =“http://www.google.com”, Target =超链接目标。空白,IsAnchor =假};这.radRichTextEditor1.InsertHyperlink(信息,“www.google.com”);}私人无效radButton2_Click(对象发件人,EventArgs e){LightVisualElement按钮=新LightVisualElement ();按钮。文本=“我”按钮;按钮。DrawFill =真正的;按钮。BackColor = System.Drawing.Color.Yellow;按钮。GradientStyle = telerik . wincontrols .GradientStyle . solid;Section Section =新节();段落=新段();InlineUIContainer容器=新InlineUIContainer ();RadElementUIContainer radContainer =新RadElementUIContainer(按钮);容器。UiElement = radContainer;容器。身高=25;容器。宽度=70;paragraph.Inlines.Add(容器);section.Blocks.Add(段);RadDocument doc =新RadDocument ();doc.Sections.Add(部分);radRichTextEditor1。InsertFragment (新DocumentFragment (doc));}私人无效radButton3_Click(对象发件人,EventArgs e){Telerik.WinForms.Documents.Model.RadDocument document = radRichTextEditor1.Document;Telerik.WinForms.Documents.FormatProviders.Html.HtmlFormatProvider提供商=新Telerik.WinForms.Documents.FormatProviders.Html.HtmlFormatProvider ();provider. exportsettings . inlineuicontainerexports += exportsettings_inlineuicontainerexports;provider.ExportSettings.DocumentExportLevel = Telerik.WinForms.Documents.FormatProviders.Html.DocumentExportLevel.Fragment;provider.ExportSettings.ExportFontStylesAsTags =真正的;provider.ExportSettings.SpanExportMode = Telerik.WinForms.Documents.FormatProviders.Html.SpanExportMode.DefaultBehavior;字符串htmlValue = provider.Export(document);webBrowser1。DocumentText = htmlValue;}私人无效ExportSettings_InlineUIContainerExporting(对象发件人,Telerik.WinForms.Documents.FormatProviders.Html.InlineUIContainerExportingEventArgs e){}
当尝试使用ExportToPDF类导出RadGridView时出现一个异常,并显示以下消息。
系统。SystemException:的系统。我thodAccessException: Attempt by security transparent method 'Telerik.Pdf.Gdi.GdiFontEnumerator.get_FamilyNames ()“通过方法调用本机代码”Telerik.WinControls.NativeMethods。EnumFontFamiliesEx(IntPtr, LOGFONT, FontEnumDelegate, Int32, Int32)“失败了。方法必须是安全关键的或安全关键的才能调用本机代码。在Telerik.Pdf.Gdi.GdiFontEnumerator.get_FamilyNames()在telerik . app . pdf . fontsetup。在telerik . apap . render . pdf . pdfrenderer中添加systemfonts (FontType FontType)。在telerik . app . fo . fotreebuilder中设置FontInfo(FontInfo FontInfo)。XmlReader Parse(读者)
只有当引用的dll以. net Framework 4.8版本为目标时才会观察到此异常。
使用以下代码:
公共子新() InitializeComponent() RadSchedulerReminder1.使用实例TimeInterval =500昏暗的任命作为新任命(DateTime.Now.AddDays (-1),时间间隔。FromHours (1),“一个”)约会。提醒=新时间间隔(10000)我.RadScheduler1.Appointments.Add(任命)昏暗的appointment2作为新任命(DateTime.Now.AddHours (-2),时间间隔。FromHours (1),“B”) appointment2。提醒=新时间间隔(10000)我.RadScheduler1.Appointments.Add RadSchedulerReminder1 (appointment2)。StartReminderInterval =日期.Now.AddDays (-1) RadSchedulerReminder1。EndReminderInterval =日期.Now.AddDays (1)结束子私人子RadForm1_Load(发送方作为对象e作为EventArgs)处理MyBase. load RadSchedulerReminder1.StartReminder() RadScheduler1. startreminder ()ActiveViewType = SchedulerViewType。周结束子
拖动“A”与“B”的间隔相同。您将注意到,提醒对话框将继续只显示“B”。
这是关于这个方法的:
公共无效SetError(GridViewCellCancelEventArgs e, Exception异常){GridViewDataErrorEventArgs args =新GridViewDataErrorEventArgs(例外,0,0, GridViewDataErrorContexts.Commit);如果(e ! =零) {args =新GridViewDataErrorEventArgs(exception, e.ColumnIndex, e.RowIndex, gridviewdataerrorcontext . commit);}这.EventDispatcher.RaiseEvent < GridViewDataErrorEventArgs > (EventDispatcher.DataError这, args);如果(args.ThrowException) {扔args.Exception;}如果(args.Cancel) {//待办事项:取消行编辑}}
该方法GridViewTemplate。SetError接受类型的形参GridViewCellCancelEventArgs(名为e),但使用该信息创建一个新的类型对象GridViewDataErrorEventArgs(名为arg游戏)并使用e中的信息来填充args。
方法然后用触发事件arg游戏.Args也有一个属性取消可以在事件处理程序中设置。但是对这个属性什么都没有做。
参数e也有一个属性取消这是永远不会被填满的。所以它可能很有用,在最后SetError,以设置e.Cancel与arg游戏。取消.调用方可以使用取消事件的信息。
这个请求也和我的下一个请求有关。
PS:为什么GridViewCellCancelEventArgs这么叫?它意味着它有一个事件的参数,但它没有用于一个事件,对吗?
复制:
这.radRichTextEditor1。文本=零;
安装R3 2022后,快速入门示例无法运行:
运行项目并打开溢出菜单。如果您聚焦其中一个编辑器并按下箭头,将出现以下错误:
在Telerik.WinControls.RadMessageFilter。NotifyGetMessageEvent(消息味精)请在VS设计器中执行以下步骤:
1.添加RadSpreadsheet和Office2019Dark主题:
2.设置ThemeName为RadSpreadsheet来Office2019Dark:
3.运行项目。你会看到行/列的标题是不可读的:
4.停止项目并重新打开设计器:
我无法提供脱离上下文就有意义的项目或代码片段,因为代码基太复杂,不容易复制。
我们正在尝试各种方法,比如调用Refresh, Update。
希望这是你以前遇到过的问题,并有一些建议。
1.选择ColorBox的椭圆来打开颜色对话框
2.选择Web选项卡
3.在本页中选择任意颜色
4.选择透明的
颜色将会更新
5.选择专业选项卡
6.选择任何颜色
颜色不会更新
7.选择任何颜色
颜色不会更新
8.在对话框上选择OK
颜色将是透明的
值是否与第7步中选择的相同
目前,RadGridView提供GridViewImageColumn.然而,它将是很好的提供支持SVG开箱即用的图像。
一种可能的方法是为GridViewImageColumn -引入一个新的属性ImageDrawType= ImageDrawType.Svg,它控制该列将存储什么类型的图像。
第二种方法是引入一个新的GridViewSvgImageColumn。