CLR Via读书笔记第一章(3)CLR执行程序集的IL代码

在了解CLR运行之前让我们先简单了解一下IL除了编译器编译的IL代码,IL也是一种汇编语言,也就是说我们可以直接编写IL代码,当然也有对应的IL编译器,值得一提的是对于面向CLR的其他语言,CLR只开放了一部分功能,而IL可以访问CLR的全部功能。前面一章我们介绍了CLR的所有初始工作,最后在调用Main入口方法的时候,CLR需要将程序集中的IL代码转为CPU指令,也就是CLR中JIT(just-in-time)编译器的职责,CLR会即时编译IL代码即时编译:在运行的时候才会进行编译(类似懒加载)当CLR运行并调用方法时做了如下几件事情 1、检测出所有方法中所有被引用的类型,并创建一个内部数据结构进行管理,每个类型的方法都会记录指向名为JITComplier函数的地址, 2、在方法被调用的时候,函数会在与元数据中查找被调用的方法对应的IL代码,对其验证并将代码编译成CPU指令 3、将CPU指令存贮到动态分配的内存中 4、回到内部数据结构中,修改对应方法记录的地址,指向刚才编译好的CPU指令的地址 5、最后函数会回到内存当中去运行CPU指令至此一个方法调用的全部流程就走完了,如果不终止程序(终止会将编译好的cpu指令丢弃),那么CLR在第二次调用方法时,直接在数据结构中找到对应的内存运行CPU指令,省去了上面的2、3、4步骤CLR的JIT编译器以及C#编译器对本机代码的优化C#编译器 :/optimize 关闭 –> 编译出的IL代码会包含许多NOP指令(no-operation 空操作)和跳转执行,vs就是利用的这些指令提供了调试的功能/optimize 开启 –> 优化后的代码会更小,程序集也会相应变小,更方便阅读IL代码(一般估计不会有人去直接阅读IL查找问题吧)JIT编译器:在 /optimize 关闭 的情况下: /debug - 关闭(默认) –> 有优化 /debug (+/full/pdbonly) –> 未优化:编译器会生成PDB文件帮助编译器查找到局部变量并将IL代码映射到源代码方便调试,如果指定的是 /debug : full 开关,编译器还会记录每一条IL指令生成的本机指令,但会使用额外的时间和内存在 /optimize 开启的情况下: /debug (-/+/full/pdbonly) –> 有优化虽然编译器在优化代码的过程中会占用额外的时间和内存,但是在实际运行阶段所带来的收益远远大于这些牺牲,并且性能上远远大于非托管代码,例如: 1、JIT编译器针对不同的CPU优化本机代码 2、会根据机器对特定的判断进行代码优化 3、CLR会根据运行状态对代码评估并重新编译(还未实现)最后再来简单了解一下NGen.exe工具NGen.exe是.net framework提供的工具,它可以将代码提前编译好,这样JIT编译器不需要在运行是编译提升性能,但其实这个工具并不是很实用 1、因为NGen无法对代码进行最优的优化 –> 因为无法确定CPU 2、对服务器提升不明显 –> 因为只是在第一次运行时有帮助,后面运行的时间时相等的 3、可能失去同步 –> 如果当前代码与执行环境不符合,那么就会从新用JIT编译至此关于CLR如何与程序集工作就完成了,下一节我们将介绍.net Framework的Framework 类库以及CTS CLS

March 28, 2019 · 1 min · jiezi

CLR Via读书笔记第一章(2)程序集和CLR的启动

这一节先简单的讨论一下程序集以及CLR的初始化虽然对应的编译器会生成托管模块,但实际上CLR不与托管模块工作,编译器除了编译还有将生成的托管模块转换为程序集的功能,微软还提供了工具AL.exe(程序集链接器)。程序集:1、是一个或者多个模块或者资源的分组,是安全性、重用、版本控制的最小单元。2、程序集还有一个类似于懒加载的机制,将不常用的类或者资源放在一个单独的文件中,当使用时才会下载,可以节约磁盘和缩短安装时间3、此外程序集还可以自描述,在CLR读取程序集时无需额外信息,因为程序集自带了关于自生的所有信息,所以更容易部署][2]编译器会通过源码生成EXE、DLL文件,但无论哪一种最终都是由CLR运行,但运行CLR之前必须先安装.net Framework,判断是否安装只需检查System32目录中是否含有MSCorEE.dll文件即可,微软还提供了CLRVer.exe检查CLR的版本号工具。但是并不是只要安装了.net Framework就可以运行程序集,需要对应程序集特定的环境才可以运行,例如生成的64位的程序集无法再32位的环境下运行,所以在运行程序集之前需要对检查程序集的信息,可以使用DumpBin.exe和CoreFlags.exe工具查看。程序集的版本是由编辑器设置的,C#的编译器提供了一个/platform开关选项可以设置生成对应的不同程序集以下是对应.platform 开关生成的模块在不同环境下的运营情况![所以在运行程序集之前大致做了如下几个动作:1、先读取程序集的信息2、创建对应环境的进程3、加载MSCorEE.add文件并调用方法初始化程序集4、加载程序集5、调用入口Main方法至此就完成的CLR的所有准备工作,接下来才是重头戏,CLR如何是如何与程序集工作,你会还了解带托管代码的多处优势

March 19, 2019 · 1 min · jiezi

ArcFace2.0+红外双目摄像头的活体检测[Windows][C#][.NET][WPF]

废话不多说 直接上图 这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红外画面的位置去检测人脸如果没有检测到,说明当前目标为非活体当在红外画面检测到人脸时,说明当前目标为活体目标再继续使用RGB图像提取特征值下面为demo效果图DEMO源码地址:https://gitee.com/jch/FaceAliveDEMO中用的C#封装库为:https://github.com/Thxzzzzz/A…由于原库有BUG,所以demo中直接附加了修复了bug的源码

March 5, 2019 · 1 min · jiezi

ActiveReports报表控件 V13 正式发布,提供在线报表设计和自适应报表布局

重磅消息, ActiveReports V13 正式发布!本次更新 ActiveReports 将给您带来全新的报表设计体验:提供在线报表设计器、提供响应式布局和屏幕尺寸自适应能力、提供全新的图表……在列举 ActiveReports 新功能之前,请下载安装程序,以便尽快体验立即试用 ActiveReports V13以下是ActiveReports V13中主要更新特性:在线报表设计器:用拖拽的方式,在 Web 应用程序和浏览器中在线设计报表!JSViewer:基于 JavaScript,为用户提供响应式布局和屏幕尺寸自适应能力。全新图表:用于 RDL 和页面报表的新图表,提供更强的交互体验和性能增强报表导入工具:区域报表可以随意转换为RDL报表和页面报表单元格自动合并:后一列的单元格会根据前一列的合并情况来判断是否进行合并富文本框增强:支持更多的HTML标记和属性,可以在设计界面立即看到文本在运行时的结果VSDesigner增强:在Visual Studio集成的报表设计器中扩展Visual Studio主题ActiveReports在线报表设计器此前,ActiveReports提供了多种用于设计报表的工具,如VSDesigner,Visual Studio加载项和独立的桌面端设计器。与此同时,ActiveReports 报表设计器组件也可以嵌入到您的应用系统中,方便您的最终用户进行报表设计。如今,在 ActiveReports V13 中,又推出了一款轻量级但功能强大的 Web 端在线报表设计器。只需几行代码,您就可以轻松地将其嵌入到您的网站和应用程序中,从而使您的用户能够设计、创建和修改报表。ActiveReports 在线报表设计器的出现,意味着您能够在 ActiveReports 设计界面中打开现有报表,并可以在其中操作布局样式、创建新报表,以及在富文本编辑器(WYSIWYG)中预览它们。ActiveReports 在线报表设计器具有熟悉、直观、设计感十足的UI,通过简单的操作,就可以实现:将控件从工具箱拖放到设计界面更改控件的位置和大小修改控件属性,如数据绑定,格式或表达式使用内置预览功能可快速了解运行时结果与桌面设计器一样,ActiveReports 在线报表设计器可完全自定义,以便实现:在最终用户使用设计器时,控制可用功能项,如预览、导出、图表功能等。JSViewer: 基于 JavaScript,为用户提供响应式布局和屏幕尺寸自适应能力ActiveReports 拥有一个快速且强大的报表引擎,在 ActiveReports V13 中又创造了一个全新的报表查看器,以进一步增强 ActiveReports 产品的功能。JSViewer 基于纯 JavaScript 编写,可以在任何现代浏览器上运行,为用户提供快速的报表渲染体验。JSViewer 支持主要的Web应用程序框架,包括 Angular、Vue、ASP.NET Core、ASP.NET MVC 和 HTML。JSViewer 包含在 ActiveReports 中,为企业级报表解决方案增加了更多应用价值。JSViewer 具有许多现有 ActiveReports 和 .NET 用户熟悉的功能。通过使用类似 .NET 的语法来嵌入和自定义 JSViewer,从而最大限度地减少了用户学习曲线。除此之外,JSViewer 还具有以下功能:一键式打印导出为常用格式(PDF,Excel等)控件上的交互式排序CSS主题使用 ActiveReports V13 中的图表,增强报表数据交互和渲染性能除了在线报表设计器和 JSViewer 之外,ActiveReports V13 中还对图表进行了改进。这是 ActiveReports V13 中实现的又一个功能和主要特性!这些图表专门为Web上的RDL和Page报表创建,它们提供更强的交互性和全面改进的性能。(RDL和页面报表的增强图表)注:ActiveReports V13 兼容了此前版本的报表设计器和经典图表,您可以在最新版 ActiveReports 中继续使用他们。使用 FormattedText 控件在报表中嵌入更多HTML(在报表中呈现HTML)FormattedText是 ActiveReports 中流行的控件之一,用于在报表中呈现HTML文本。在 ActiveReports V13 中,又增强了 FormattedText 以支持更多HTML标记和属性。此外,用户现在可以在设计时看到控件中的渲染文本,以确保在 WYSIWYG 显示正确结果。新的HTML标记和属性包括表格、文本对齐和样式。VSDesigner 加载项增强:使用 Visual Studio 主题(VSDesigner中的扩展Visual Studio主题)ActiveReports 是将报表设计器直接集成到 Visual Studio 中的少数几家报表工具供应商之一。通过将 Visual Studio 主题扩展到 ActiveReports 设计器及其支持窗口,以扩展这种集成的深度。这为报表设计人员提供了一个很好的UI样式支持。以上就是 ActiveReports V13 中的主要新特性介绍,想了解更多产品信息和新功能,请登陆 ActiveReports 官网。针对本次新版本发布,我们还推出了 ActiveReports V13新版本发布公开课,欢迎大家预约收看观看地址:http://live.vhall.com/552006188 ...

January 25, 2019 · 1 min · jiezi

【RPA干货来袭】使用.net为UiBot扩展功能

.Net 插件开发教程:开发工具要求:安装 vs2015,并安装.Net Framework 4.5.2以管理员的身份打开vs2015,并创建工程右键打开属性页(应用程序)程序集名称 与 默认命名空间 修改为 “<插件名>”(扩展名 使用英文字符)打开 程序集信息 对话框选中 使程序集 COM 可见,确定保存 属性页 修改打开 属性页 生成选中 为 COM 互操作注册保存 属性页 修改删除工程 默认 添加的cs文件右键 添加接口类为 interface 添加 Guid选择工具菜单, 创建GUID选择第 5 类guid复制到 guid 字符串到interface 文件中添加 using System.Runtime.InteropServices; 到文件中添加接口方法[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]创建事件接口添加接口实现文件编译,在bindebug目录下生成 dll与 tlb 两个文件将文件 复制到uibot 安装目录 extendDotNet 下,两个文件要分开放置Dll文件要放在与dll同名的文件夹下,tlb文件 放在 extendDotNet 下注册插件C:WindowsMicrosoft.NETFrameworkv4.0.30319RegAsm /codebase <dll>调用之前 需要 import 插件如果插件 dll 有 其他的依赖,请全部复制到插件目录

January 23, 2019 · 1 min · jiezi

.NET环境大规模使用OpenTracing

作者:Austin ParkerOpenTracing的最大优势之一是围绕它构建的社区,涵盖各种语言和技术。考虑到这一点,我很高兴今天在OpenTracing博客上发表一篇由Aaron Stannard撰写的客座文章。Aaron Stannard是Petabridge的创始人兼首席执行官,Petabridge是一家帮助.NET公司构建大规模分布式系统的创业公司。他也是Akka.NET项目的联合创始人。你可以在Twitter上找到他,网址是https://twitter.com/Aarononth…在过去的五年里,我一直担任Akka.NET开源项目的维护者和联合创始人之一,该项目是最初在Scala开发,极受欢迎的Akka项目的C#和F#移植。我最初开始这个项目,是因为.NET生态系统缺乏用于构建实时大型应用程序类型的工具和框架,就像那时我在MarkedUp开发的那种类型,MarkedUp是我运行的营销自动化和分析的初创公司。在关闭MarkedUp后,我继续创建了Petabridge,这是一家致力于在.NET中支持和开发Akka.NET,和其他分布式系统技术的开源公司。我很高兴地报告说,现在.NET社区有一个更强大的开源生态系统,并且有更多的工具选择,可用于构建我在2013-14年工作的.NET中的大规模应用程序类型。随着.NET Core的出现,整个.NET生态系统正在发生巨大变化,.NET Core是一种高性能,轻量级和100%跨平台的.NET运行时(runtime)的新实现。这为.NET开发者开辟了一个新的可能性,而这之前根本就没有。使用Akka.NET和Actor模型的大规模.NETAkka和Akka.NET,如果你还没有听说过,是在通用虚拟机(分别是JVM和CLR)之上构建的actor模型的实现。演员(actor)模型是一个可追溯到早期20世纪70年代的旧概念,但近年来它重新焕发活力,因为它提供了一种易于在大型数据中心或公共云环境中分发,可理解的计算模型。你问,“可理解的计算模型”做什么?具体来说,actor模型为需要构建可扩展实时系统的开发者,找到了一个家,例如:多人视频游戏;分析(Analytics);营销自动化;医疗/医疗物联网;物流、交通和运输;能源;金融;和实时交易处理(ACH、支付处理器等)所有这些应用程序的共同点是,它们履行了对客户和利益相关者的义务,他们必须能够以一致的快速(实时)方式完成工作,而不管系统的总量(可扩展)。为了使这些应用程序满足这两个目标,它们必须是有状态的,这意味着真实的来源来自应用程序内存,而不是外部数据库。为了使有状态应用既具有容错性,和高可用性,它们也必须分散(decentralized),状态不能集中在一个区域,否则系统容易受到单点瓶颈和单点故障限制的影响。这是actor模型允许开发者做的事情:构建高度分散、容错、有状态的应用程序,其中每个工作(actor)单元都是自包含的私有状态,不能直接从外部修改。修改actor的状态的唯一方法,是通过向该actor发送一条消息,该actor最终将处理该消息,从而可能导致更新actor的状态。在.NET中,Akka.NET是构建这些类型应用程序的主要actor模型实现,它被数百家公司使用,包括戴尔、美国银行、波音、S&P Global、Becton Dickinson、美国能源部,Zynga等等。然而,演员模型为试图大规模采用它的软件团队提出了一些重大挑战,其中最痛苦的一个是大规模诊断和调试编程错误和网络相关问题。这就是OpenTracing和分布式跟踪的登场时间。使用OpenTracing以低成本了解复杂性Akka.NET和大规模分布式演员的问题在于,在任何特定时间,你的系统每秒都可以进行数千万次交互,看起来与此太相似:Akka.NET ActorSystem中的每个actor通常都有一些少量的自包含状态,一些消息处理代码执行其实际工作,以及一些对它经常与之通信的其他actor的引用。演员通过来回传递消息来相互通信。默认情况下,在actor模型中传递的消息100%是异步的,actors一直按照它们被发送的顺序处理消息,但是一个actor可能必须处理来自许多其他actor的消息。Actor可以跨进程和网络边界透明地相互通信,因此,发送到一个进程内的单个actor的消息可能最终传播到多个进程。其中存在的问题是:这种位置透明性,使得演员如此擅长以可扩展的方式分配工作,这可能会使他们在生产中出现问题时进行调试时非常令人沮丧:知道出现问题的地点和时间变成一个非凡问题,尤其是当你有数百万次这样的操作一直在发生时。这是我们发现OpenTracing特别有用的地方。Akka.NET应用程序不作为单线程,单体进程存在,它们是高度并发且通常是分布式的进程。因此.NET中常见的传统跟踪工具,如Intellitrace,通常无法帮助我们回答系统内部“出了什么问题?”。我们需要的是分布式跟踪工具,它们可以从多个进程收集上下文,将它们关联在一起,并从分布式系统的角度讲述完整的故事。我们需要能够回答诸如“akka.tcp://ClusterSys@10.11.22.248:1100/user/actorA/child2收到msg1后,发送给akka.tcp://ClusterSys@10.11.22.249:1100/user/processB/child1的是什么?”,只有在这两个进程上运行的分布式跟踪工具,才能有效地回答这个问题,而这正是我们在Petabridge上使用OpenTracing的原因。OpenTracing实施和优势Petabridge专业支持大规模采用Akka.NET的用户,这意味着我们必须提供各种工具来帮助他们的生活更轻松。这就是为什么我们开始创建Phobos,这是Akka.NET的监控和跟踪解决方案。我们希望通过开发某种分布式跟踪实现,帮助我们的用户解决这个Akka.NET可观察性问题,这些实现可以轻松地包含在他们的应用程序代码。但我们遇到了一个小问题:我们的客户无法接受单一供应商的解决方案作应用程序性能监视,他们肯定不会接受只适用于Akka.NET,而不适用于其他重要的.NET技术,如ASP.NET Core和SignalR。OpenTracing为我们优雅而简单地解决了这个问题:通过瞄准OpenTracing标准,而不是任何单一的销售解决方案,如Zipkin或Jaeger,我们可以为我们的客户打开门口,让他们选择他们想要的任何跟踪解决方案。我们也知道,我们很可能会为.NET用户创建一些兼容OpenTracing的驱动程序,他们希望能够使用我们和其他依赖该标准的产品。因此,我们针对优秀的OpenTracing C#库构建了Phobos的跟踪功能,并设计了Zipkin和Jaeger等工具基于OpenTracing绑定的第一方集成。这大大降低了我们的开发成本,增加了用户享受的选择自由。每次演员发送或接收消息时,我们都会创建一个新的Span,并将跟踪标识符传播到我们在演员之间传递的每条消息中,包括通过网络传递。我们能够构建所有这些,因此它在幕后工作,而不需要太多的手动仪器(instrumentation)。可以肯定的是,OpenTracing允许我们使用Jaeger制作像这样的可理解的图形:在这种情况下,我们正在建模一个“扇出”(“fan out”)调用,其中一个节点通过网络向许多其他节点发出呼叫,使用传统工具难以捕获的东西,因为它涉及多个节点上的大量并发处理和每个人之间的异步沟通。但是使用OpenTracing的标准,我们很容易使用像Jaeger这样的工具来实现这一点,Jaeger在C#中有一个很好的OpenTracing兼容驱动程序。在.NET中创建OpenTracing驱动程序一旦Phobos完全支持OpenTracing,作为我们最终用户的集成点,我们就知道任何拥有内部或第三方跟踪解决方案,但本身不支持OpenTracing的Akka.NET用户最终都可以找到一种方法使用OpenTracing库来将事情联系在一起。但是,我们决定加倍努力,采用一些已经在.NET社区中流行的现有工具,或者通过为这些产品推出第一方OpenTracing驱动程序和适配器来降低进入门槛。我们建造的第一个是Petabridge.Tracing.Zipkin,一个用于Zipkin的高性能OpenTracing兼容驱动程序;我们想在内部使用Zipkin,并希望原生支持像Kafka的传送选项。在许多.NET用户的要求下,我们构建的第二个也是更有趣的是Microsoft Application Insights OpenTracing适配器,用于我们的Akka.NET跟踪产品。对Azure上运行的用户,我们希望能够支持Application Insights作为的跟踪目标,但是没有用于将Application Insights插入OpenTracing的内置解决方案。因此,我们遵循了Microsoft团队编写的标准文档,该文档允许我们在OpenTracing的词典之上映射Application Insights常规,并且能够创建一个开源软件包Petabridge.Tracing.ApplicationInsights,它弥合了这两者之间的差距技术,使Application Insights在大型Akka.NET应用程序中完美可行。我们在发布软件包之后发现,即便是微软本身也在使用OpenTracing和我们的Application Insights驱动程序来内部测试他们自己的一些云应用程序。对于整个.NET生态系统中的每个人来说,这是一件好事:随着OpenTracing继续获得牵引力,它将有助于推动其作为行业标准实践的使用。随着我们继续推动大规模.NET系统的规模和速度的界限,像我们这样的组织将继续投资OpenTracing等技术,以及其有前途的监控对手OpenMetrics,以限制运行这些系统的运营和管理成本。到目前为止,OpenTracing已经为我们的公司和整个Akka.NET项目带来了惊人的表现,我们期待在未来看到更多。-Aaron Stannard,Petabridge首席执行官Akka.NET项目联合创始人2019年KubeCon + CloudNativeCon中国论坛提案征集(CFP)现已开放KubeCon + CloudNativeCon 论坛让用户、开发人员、从业人员汇聚一堂,面对面进行交流合作。与会人员有 Kubernetes、Prometheus 及其他云原生计算基金会 (CNCF) 主办项目的领导,和我们一同探讨云原生生态系统发展方向。2019年中国开源峰会提案征集(CFP)现已开放在中国开源峰会上,与会者将共同合作及共享信息,了解最新和最有趣的开源技术,包括 Linux、容器、云技术、网络、微服务等;并获得如何在开源社区中导向和引领的信息。大会日期:提案征集截止日期:太平洋标准时间 2 月 15 日,星期五,晚上 11:59提案征集通知日期:2019 年 4 月 1 日会议日程通告日期:2019 年 4 月 3 日幻灯片提交截止日期:6 月 17 日,星期一会议活动举办日期:2019 年 6 月 24 至 26 日2019年KubeCon + CloudNativeCon + Open Source Summit China赞助方案出炉啦

January 22, 2019 · 1 min · jiezi

新的尝试!ComponentOne WinForm 和 .NET Core 3.0

在微软 Build 2018 开发者大会上,.NET 团队公布了 .NET Core 的下一个主要版本 .NET Core 3.0 的规划蓝图:.NET Core 3将开始支持Windows桌面应用程序,包括Windows Form、Windows Presentation Framework(WPF)和UWP XAML。届时在 .NET Core 3上将能运行Windows桌面应用程序,在享受 .NET Core新架构优势便利的同时,兼容老的 .net应用。目前为止,.Net Core 3.0 的首个预览版已正式发布,而正式版本也将在今年全面推出。作为经典的全功能 .NET控件集,ComponentOne技术团队一直专注于行业未来的发展方向,2019年 ComponentOne 将继续增强产品功能、增加新的控件并全面兼容 .Net Core 3.0。在此之前,ComponentOne 技术团队一直致力于研究框架和库的变化和兼容性。因此,在 .Net Core 3.0正式版中使用任何 ComponentOne 控件将不需要进行任何更改(由于某些类缺少,有些控件当前在 .Net Core 3.0 预览版中不起作用。要了解未解决的问题,请跳至本博客的最后一部分)。现在,我们将以 ComponentOne 其中一个Demo为例,看看如何将它移植到 .NET Core 3.0 中,此步骤与GitHub上的步骤类似。先决条件安装 .NET Core 3.0 SDK。选择适当您的平台下载安装程序(如果您使用的是64位操作系统,请使用x64;如果您使用的是32位操作系统,请选择x86)。本Demo是使用VS2019运行的,您可以在此处下载预览版。安装ComponentOne WinForms Edition(在此处获取免费试用版)。如果已安装本程序,则可以跳过此步骤。运行步骤第1步考虑到VS2019预览版中的工具有限,缺少WinForms的项目模板,我们将使用命令提示符创建一个新项目。打开命令提示符并运行以下命令:dotnet new winform -o TestWFCore上述代码会创建一个名为TestWFCore的新项目。该项目位于c: Users(YourAccount)下通过命令提示符导航到项目目录cd TestWFCore第2步通过命令提示符添加Windows兼容包,如下所示:dotnet add package Microsoft.Windows.Compatibility第3步使用dotnet run运行应用程序以确保项目正常工作。dotnet run你将看到:Hello .NET Core!现在我们可以在Visual Studio中打开它。Visual Studio中的项目第4步我们将在.Net Core 3.0中运行现有示例,我们将在此位置进行移植“ComboBoxItemModes”输入示例:〜 Documents ComponentOne Samples WinForms C1Input CS ComboBoxItemModes将上述示例中的所有csharp文件链接到此项目。同时包含licences.licx,它位于Properties文件夹下。将licenses.licx文件标记为嵌入资源。大多数现有项目都包含Properties文件夹中的AssemblyInfo.cs文件。新项目样式使用不同的方法,并在构建过程中生成相同的程序集属性。要禁用该行为,可以添加属性GenerateAssemblyInfo:<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <generateassemblyinfo>false</generateassemblyinfo></PropertyGroup>第5步添加C1.Win.Input程序集的参考。第6步修改program.cs文件以创建Form1的实例并运行该应用程序。这类似于任何WinForms应用程序。 class Program { static void Main() { Application.Run(new Form1()); } }第7步构建并运行应用程序:Demo 示例下载按照上述步骤,我们创建了一个简单的示例,用于在 .NET Core 3.0 中运行不同的 ComponentOne 控件,段尾提供了 Demo 的下载示例。在运行示例之前,请查看自述文件。您将在以下位置找到 .NET Core 3.0 项目文件:〜 DotNetCore3Sample WinForms CS DotNetCore3 DotNetCore3.NET Core 3示例.NET Core 3.0预览中的问题目前,由于 .NET Core 3.0 预览版尚未移植 WinForms 类,FlexGrid、TrueDbGrid、ThemeController和Command在 .NET Core 3.0 预览版中运行时会出现bug。这些bug会在下一个预览版中得到修复:https://github.com/dotnet/cor…最后伴随着 .NET Core 3.0的到来,以及 WinForm 和 WPF 的开源,ComponentOne 也将迎来更多改变,针对桌面应用程序、.NET Core Web API,ComponentOne将推出一系列全新控件和增强功能。期待 ComponentOne 2019 将带给您更多惊喜!ComponentOne EnterpriseComponentOne是一款专注于企业应用高性能开发的 .NET 全功能控件套包,包含300余种控件,支持7大平台,涵盖7大功能模块。较于市面上其他同类产品,ComponentOne更加轻盈,功能更加强大,20多年的开发经验,将为您的应用系统带来更为安全的使用体验。纯中文操作界面,一对一技术支持,厂商级的技术服务,共同造就了这款国际顶级控件套包。 ...

January 17, 2019 · 1 min · jiezi

开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源

DncZeus前言关于 DncZeusDncZeus = Dnc + Zeus"Dnc"–.Net Core 的缩写;“Zeus”–中文译为宙斯,是古希腊神话中的众神之王,奥林匹斯十二主神之首,统治宇宙万物的至高无上的主神(在古希腊神话中主神专指宙斯),人们常用“众神和人类的父亲”、“神王”来称呼他,是希腊神话诸神中最伟大的神。DncZeus的愿景就是做一个.NET Core 领域的简易精致的通用后台权限管理模板系统基础框架,努力向.NET Core 领域的"宙斯"看齐。项目简介DncZeus是一个基于 ASP.NET Core 2 + Vue.js 的前后端分离的通用后台管理系统框架。后端使用.NET Core 2 + Entity Framework Core 构建,UI 则是目前流行的基于 Vue.js 的 iView。项目实现了前后端的动态权限管理和控制以及基于 JWT 的用户令牌认证机制,让前后端的交互更流畅。DncZeus并不是一个完整的业务系统,但她提供完成业务系统的绝大多数开发场景,让每一位.NET 开发者都能基于DncZeus快速开发出交互、体验以及功能具佳的.NET Core 单页应用程序(SPA)。支持DncZeus(求Start :))如果你觉得DncZeus对你或者他人有用,请为DncZeus点个赞,求扩散,让更多人获得帮助!!!在线体验(Demo)超级管理员:administrator 管理员:admin密码:111111地址:https://dnczeus.codedefault.com由于是个人项目,资金有限,体验服是低配,请大家爱惜,轻戳,不胜感激!!!适合人群由于 DncZeus 考虑到初级.NET 开发者都可以使用,所以后端项目未涉及过多架构和封装(代码逻辑一目了然),但为了你更好地熟悉和运用 DncZeus,你需要了解:ASP.NET CoreVue.jsiViewASP.NET Core 的知识能确保你可以看懂和了解后端是如何实现和工作的,而 Vue.js 框架则是前端实现的基石,当然 iView 这个基于 Vue.js 的 UI 框架也是必须要了解的,因为 DncZeus 正是基于 [iview-admin]1来实现的前端 UI 交互。如果你对这两个方面的知识还不熟悉,建议你可以先学习一些理论再来运用 DncZeus 这个框架。关于 ASP.NET Core 和 Vue.js 的入门请参考:ASP.NET Core 官方文档Vue.js 官方文档环境和工具Node.js(同时安装 npm 前端包管理工具)Visual Studio 2017(15.8.8 或者以上版本)VS Code 或者其他前端开发工具git 管理工具SQL Server CE 或者 SQL Server Express 或者 SQL Server 2014 +技术实现ASP.NET Core 2(.NET Core 2.1.502)ASP.NET WebApi CoreJWT 令牌认证AutoMapperEntity Framework Core 2.0.NET Core 依赖注入Swagger UIVue.js(ES6 语法)iView(基于 Vue.js 的 UI 框架)下载项目使用Git工具下载首先请确保你本地开发环境已安装了git管理工具,然后在需要存放本项目的目录打开git命令行工具Git Bash Here,在命令行中输入如下命令:git clone https://github.com/lampo1024/DncZeus.git以上命令就把DncZeus的远程代码拉取到你的本地开发机上。手动下载如果你不愿意使用git管理工具下载DncZeus的远程代码,你也可以在github托管地址手动下载,打开地址https://github.com/lampo1024/…,找到页面中的按钮"Clone or download",如下图示:在弹出的对话框中点击按钮"Download ZIP"即可开始下载DncZeus的源代码,如下图:安装依赖前端项目在将DncZeus的源代码下载到本地之后,如果你使用的git管理工具,可以不用退出当前的git管理工具,输入如下命令:cd DncZeus/DncZeus.App进入到DncZeus的前端项目目录DncZeus.App。在命令行中输入如下命令进行前端依赖包的还原操作:npm install或者npm i后端项目在Visual Studio中打开解决方案[DncZeus.sln]。首先根据自己的开发环境(SQL Server数据库类型,本示例默认是SQL Server Localdb)修改配置文件appsettings.json中的数据库连接字符串,示例默认连接字符串为:“ConnectionStrings”: { “DefaultConnection”: “Server=(localdb)\mssqllocaldb;Database=DncZeus;Trusted_Connection=True;MultipleActiveResultSets=true” }再打开包管理控制台(Package Manager Console),执行如下命令生成数据库表结构:Update-Database -verbose最后,打开项目根目录中的脚本文件夹[Scripts],执行脚本文件[Init_data.sql]以初始化系统数据。恭喜你,到这里所有的准备工作就完成了。赶紧体验DncZeus框架吧!!!运行使用Visual Studio开发工具打开DncZeus根目录中的VS解决方案文件DncZeus.sln,设置DncZeus.Api项目为默认启动项并运行此项目。这时在浏览器中打开地址:http://localhost:54321/swagger ,便可以查看到DncZeus已经实现的后端API接口服务了。在命令行中进入到DncZeus的前端项目目录[DncZeus.App],运行如下命令以启动前端项目服务:npm run dev成功运行后会自动在浏览器中打开地址: http://localhost:9000使用和授权DncZeus项目是一个开源项目,你可以直接基于本项目进行扩展或者二次开发,也可以修改其中的代码。但请保留原文件中的版权信息,尊重本人的劳动成果,违者必究,谢谢合作。问题与反馈遇到问题怎么办?直接提交issueQQ群:483350228码友网 ...

December 21, 2018 · 1 min · jiezi

gRPC遇见.NET SDK和Visual Studio:构建时自动生成编码

作者:Kirill’kkm’Katsnelson作为微软向其跨平台.NET产品发展的一部分,他们大大简化了项目文件格式,并允许第三方代码生成器与.NET项目的紧密集成。我们一直倾听,现在很自豪地介绍从Grpc.Tools NuGet包的1.17版本开始,.NET C#项目中的Protocol Buffer和gRPC服务.proto文件的集成编译。1.17版本现在可以从Nuget.org获得。你不再需要使用手写脚本从.proto文件生成代码:.NET构建神奇地为你处理此问题。集成工具在调用代码生成器之前,定位proto编译器和gRPC插件,标准Protocol Buffer导入和跟踪依赖关系,以便生成的C#源文件永远不会过时,同时将重新生成保持在最低要求。实质上,.proto文件被视为.NET C#项目中的第一类源。演练在这篇博文中,我们将介绍最简单,且可能是最常见的方案,使用跨平台dotnet命令从.proto文件创建库。我们将基本实现Greeter库的克隆,由C#Helloworld示例目录中的客户端和服务器项目共享。创建新项目让我们从创建新的库项目开始。/work$ dotnet new classlib -o MyGreeterThe template “Class library” was created successfully./work$ cd MyGreeter~/work/MyGreeter$ ls -lFtotal 12-rw-rw-r– 1 kkm kkm 86 Nov 9 16:10 Class1.cs-rw-rw-r– 1 kkm kkm 145 Nov 9 16:10 MyGreeter.csprojdrwxrwxr-x 2 kkm kkm 4096 Nov 9 16:10 obj/观察到dotnet new命令创建了我们不需要的文件Class1.cs,因此将其删除。另外,我们需要一些.proto文件来编译。在本练习中,我们将从gRPC发行版中复制示例文件examples/protos/helloworld.proto。/work/MyGreeter$ rm Class1.cs/work/MyGreeter$ wget -q https://raw.githubusercontent.com/grpc/grpc/master/examples/protos/helloworld.proto(在Windows上,使用del Class1.cs,如果你没有wget命令,只需打开上面的URL,并使用Web浏览器中的“另存为…”命令)。接下来,将必需的NuGet包添加到项目中:/work/MyGreeter$ dotnet add package Grpcinfo : PackageReference for package ‘Grpc’ version ‘1.17.0’ added to file ‘/home/kkm/work/MyGreeter/MyGreeter.csproj’./work/MyGreeter$ dotnet add package Grpc.Toolsinfo : PackageReference for package ‘Grpc.Tools’ version ‘1.17.0’ added to file ‘/home/kkm/work/MyGreeter/MyGreeter.csproj’./work/MyGreeter$ dotnet add package Google.Protobufinfo : PackageReference for package ‘Google.Protobuf’ version ‘3.6.1’ added to file ‘/home/kkm/work/MyGreeter/MyGreeter.csproj’.将.proto文件添加到项目中接下来是一个重要的部分。首先,默认情况下,.csproj项目文件会自动在其目录中找到所有.cs文件,尽管Microsoft现在建议禁止这种通配行为,所以我们也决定不通配.proto文件。因此,必须明确地将.proto文件添加到项目中。其次,将属性PrivateAssets=“All”添加到Grpc.Tools包参考中是非常重要,这样新库的使用者就不会不必要地获取它。这是有道理的,因为程序包只包含编译器、代码生成器和导入文件,这些在.proto文件编译的项目之外是不需要的。虽然,在这个简单的演练中并非严格要求,但始终应该是你的标准做法。因此,编辑文件MyGreeter.csproj以添加helloworld.proto以便将其编译,并将PrivateAssets属性添加到Grpc.Tools包参考中。你生成的项目文件现在应如下所示:<Project Sdk=“Microsoft.NET.Sdk”> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include=“Google.Protobuf” Version=“3.6.1” /> <PackageReference Include=“Grpc” Version=“1.17.0” /> <!– The Grpc.Tools package generates C# sources from .proto files during project build, but is not needed by projects using the built library. It’s IMPORTANT to add the ‘PrivateAssets=“All”’ to this reference: –> <PackageReference Include=“Grpc.Tools” Version=“1.17.0” PrivateAssets=“All” /> <!– Explicitly include our helloworld.proto file by adding this line: –> <Protobuf Include=“helloworld.proto” /> </ItemGroup></Project>构建它!此时,你可以使用dotnet build命令构建项目,以编译.proto文件和库程序集。在本演练中,我们将在命令中添加日志切换开关-v:n,所以我们可以看到编译helloworld.proto文件的命令是在运行。你可能会发现,在第一次编译项目时,总是这样做是个好主意!请注意,下面省略了许多输出行,因为构建输出非常详细。/work/MyGreeter$ dotnet build -v:nBuild started 11/9/18 5:33:44 PM. 1:7>Project “/home/kkm/work/MyGreeter/MyGreeter.csproj” on node 1 (Build target(s)). 1>_Protobuf_CoreCompile: /home/kkm/.nuget/packages/grpc.tools/1.17.0/tools/linux_x64/protoc –csharp_out=obj/Debug/netstandard2.0 –plugin=protoc-gen-grpc=/home/kkm/.nuget/packages/grpc.tools/1.17.0/tools/linux_x64/grpc_csharp_plugin –grpc_out=obj/Debug/netstandard2.0 –proto_path=/home/kkm/.nuget/packages/grpc.tools/1.17.0/build/native/include –proto_path=. –dependency_out=obj/Debug/netstandard2.0/da39a3ee5e6b4b0d_helloworld.protodep helloworld.proto CoreCompile: [ … skipping long output … ] MyGreeter -> /home/kkm/work/MyGreeter/bin/Debug/netstandard2.0/MyGreeter.dllBuild succeeded.如果此时再次调用dotnet build -v:n命令,则不会调用protoc,也不会编译C#源。但是,如果你更改了helloworld.proto源代码,那么在构建期间它的输出将被重新生成,然后由C#编译器重新编译。这是你期望修改任何源文件的常规依赖关系跟踪行为。当然,你也可以将.cs文件添加到同一个项目中:毕竟,它是构建.NET库的常规C#项目。我们在RouteGuide示例中是这样做的。生成的文件在哪里?你可能想知道原型编译器和gRPC插件输出C#文件的位置。默认情况下,它们与其他生成的文件,放在同一目录中,例如对象(在.NET构建用语中称为“中间输出”目录),在obj/目录下。这是.NET构建的常规做法,因此自动生成的文件,不会使工作目录混乱,或意外地置于源代码控制之下。否则,调试器等工具可以访问它们。你也可以在该目录中看到其他自动生成的源:~/work/MyGreeter$ find obj -name ‘.cs’obj/Debug/netstandard2.0/MyGreeter.AssemblyInfo.csobj/Debug/netstandard2.0/Helloworld.csobj/Debug/netstandard2.0/HelloworldGrpc.cs(如果你从Windows命令提示符下执行此演练,请使用dir /s obj .cs)还有更多虽然,在许多情况下最简单的默认行为是足够的,但是有很多方法可以在大型项目中,微调.proto编译过程。如果你发现默认安排不适合你的工作流程,我们建议你阅读文档文件BUILD-INTEGRATION.md,以获取可用选项。该软件包还扩展了Visual Studio的“属性”窗口,因此你可以在Visual Studio界面中为每个文件设置一些选项。“经典”.csproj项目和Mono也有支持。分享你的经验与任何复杂功能的初始版本一样,我们很高兴收到你的反馈。有什么不符合预期的工作?你有不容易用新工具覆盖的场景吗?你是否知道如何改善工作流程?请仔细阅读文档,然后在GitHub上的gRPC代码存储库中提交问题。你的反馈,对于确定构建集成工作的未来发展方向,非常重要! ...

December 20, 2018 · 1 min · jiezi

【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton

概述在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。FlexGrid 简介FlexGrid 是业界推崇的 .NET 数据表格,集成于 ComponentOne Enterprise .NET控件集中,可灵活、轻量、快速用于 WPF、WinForm、UWP、MVC、Silverlight、ActiveX平台。分层数据展示在分层数据展示中,FlexGrid 可以使用Node.Checked属性在任何节点行之前显示CheckBox。 然后,父节点之前的这些复选框可用于添加功能,例如启用/禁用或选择/取消选择树中的所有子节点。假设用户想要利用RadioButton来代替这些复选框,并且,需要在对子节点进行“选择/取消”按钮操作时,同时影响父节点状态的功能,利用 FlexGrid 数该如何实现?是否有可能在树中显示单选按钮?答案是肯定的。 诀窍是使用 FlexGrid网格中子节点的Node.Image属性显示RadioButton图像。Node child = c1FlexGrid1.Rows.AddNode(1);child.Image = Image.FromFile("../../Resources/Img_Unchecked.png");我们刚刚展示了效果图。 现在,我们需要在改变“选中/取消”父节点时同时影响子节点状态。 为了满足这一要求,FlexGrid 网格的CellChecked事件将是一个不错的选择。当用户改变父节点当前状态时,它会被触发。private void C1FlexGrid1_CellChecked(object sender, RowColEventArgs e){ //Get the checked/unchecked node row Node node = c1FlexGrid1.Rows[e.Row].Node; //If node row is itself a parent if (node.Parent == null) { //If checked if (node.Checked == CheckEnum.Checked) { //For each child row foreach(Node childNode in node.Nodes) { //Enabled childNode.Row.AllowEditing = true; childNode.Row.StyleNew.BackColor = Color.White; } } //If unchecked else if(node.Checked == CheckEnum.Unchecked) { //For each child row foreach (Node childNode in node.Nodes) { //Disabled childNode.Row.AllowEditing = false; childNode.Row.StyleNew.BackColor = Color.LightGray; } } }}接下来,如果通过网格的MouseDown事件中的代码启用了子节点,它将处理单选按钮的切换。private void C1FlexGrid1_MouseDown(object sender, MouseEventArgs e){ HitTestInfo hti = c1FlexGrid1.HitTest(e.Location); //Get node row corresponding to clicked row Node node = c1FlexGrid1.Rows[hti.Row].Node; Rectangle cellBounds = c1FlexGrid1.GetCellRect(hti.Row, hti.Column); //If it is a child row if(node.Parent != null) { //Only for RadioButton if (hti.Column == 1 && node.Level == 1 && (hti.X >= cellBounds.X + 33) && (hti.X <= cellBounds.X + 43)) { //Check if enabled if(node.Row.AllowEditing) { //Currently unchecked if (Convert.ToInt32(node.Key) == 0) { //Checked state node.Image = Image.FromFile("../../Resources/Img_Checked.png"); node.Key = 1; } //Currently checked else { //Unchecked state node.Image = Image.FromFile("../../Resources/Img_Unchecked.png"); node.Key = 0; } } } }}在上面的代码中,我们在Node.Key属性中存储二进制状态:0表示未检查状态,1表示已检查状态。以上就是关于:如何在ComponentOne FlexGrid树中显示RadioButton的具体做法。与此同时,如果需要显示RadioButton以外的控件,ComponentOne 也同样支持!ComponentOne Enterprise | 下载试用ComponentOne是一款专注于企业应用高性能开发的 .NET 全功能控件套包,包含300余种控件,支持7大平台,涵盖7大功能模块。较于市面上其他同类产品,ComponentOne更加轻盈,功能更加强大,20多年的开发经验,将为您的应用系统带来更为安全的使用体验。纯中文操作界面,一对一技术支持,厂商级的技术服务,共同造就了这款国际顶级控件套包。您对ComponentOne 产品的任何技术问题,都有技术支持工程师提供1对1专业解答,点击此处即可发帖提问>> 技术支持论坛 ...

December 19, 2018 · 1 min · jiezi

关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)

概述数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等。在ComponentOne For WinForm 最新版 2018V3 中,我们推出了数据过滤器的测试版,可以附加到任何数据感知控件中。滤镜布局由手风琴面板组成,它为过滤条件提供了扩展/折叠选项:以下就是ComponentOne For WinForm DataFilter控件的一些用法。使用DataFilter过滤仪表板中的多个控件仪表板是DataFilters的最佳实践,因为屏幕上的所有信息都可以在一个地方以交互方式进行过滤,从而使用户可以通过选择从数据中获取更多信息。 此外,每个视觉所触及之处都可以连接到DataFilter以进一步向下钻取。当产品目录涉及大量有关产品的信息时,数据切片器将会派上用场:将DataFilter控件集成到FlexGrid中在处理Grid或TreeView等数据控件时,切片器可以是一个有用的交互式过滤工具。 当用户需要在多个列上进行过滤时,可以更轻松地将它们全部设置在一个位置:WinForm DataFilter的体系结构DataFilter使用C1CollectionView进行过滤。 C1CollectionView 功能类似于 .NET CollectionView,它支持对集合进行过滤、分组和排序。在系统内部,当数据过滤器根据用户选择创建过滤器表达式时,表达式将传递给C1CollectionView。 C1CollectionView创建数据源的视图,并根据此表达式应用过滤器。WinForm DataFilter的用户界面数据过滤器控件使用的基本布局是“抽屉效果”。 即,每个过滤器项目一个接一个地堆叠,其中每个过滤器项目都可以折叠和展开。在DataFilter中自动选择过滤器类型该控件为不同类型的数据生成不同的过滤器控件:对于布尔数据字段,DataFilter控件生成一个BoolFilter,由复选框表示。对于数字数据字段,控件将生成RangeFilter,它提供范围编辑器和范围滑块以过滤指定范围内的值。对于文本/字符串数据字段,控件生成ChecklistFilter,允许用户从清单中选择和过滤项目。对于DateTime数据字段,控件生成DateRangeFilter,它提供范围编辑器和范围滑块以过滤指定日期范围内的值。异步过滤异步过滤最常见的使用场景是处理大数据时避免阻塞UI。 DataFilter控件中有一个名为ApplyFilterAsync的内置方法,就可以实现异步过滤。保存并加载过滤器DataFilter控件支持通过C1DataFilter类的SaveFilterExpression和LoadFilterExpression方法进行序列化。SaveFilterExpression方法将当前过滤器表达式从C1.Win.DataFilter.C1DataFilter.Filters集合保存到XML文件。 LoadFilterExpression方法从XML文件加载保存的过滤器表达式。设置WinForm DataFilter控件的样式C1DataFilter类提供了一个Styles属性,可用于自定义DataFilter控件及其元素的外观。 在这里,您可以看到如何编辑按钮、过滤器、复选框、编辑器、标题、过滤器标题和滚动条:将 ComponentOne 主题应用于DataFilterDataFilter支持ComponentOne For WinForm中包含的所有主题,包括最近添加的Material和Office 2016主题。 使用C1ThemeController即可在应用程序范围内应用主题:DataFilter在许多应用程序中非常有用。请下载试用最新版 ComponentOne Enterprise .NET控件集,体验产品并分享您的建议和反馈,以帮助我们改进产品体验,并添加在2019年v1即将发布的 ComponentOne 新版本上!ComponentOne Enterprise | 下载试用ComponentOne是一款专注于企业应用高性能开发的 .NET 全功能控件套包,包含300余种控件,支持7大平台,涵盖7大功能模块。较于市面上其他同类产品,ComponentOne更加轻盈,功能更加强大,20多年的开发经验,将为您的应用系统带来更为安全的使用体验。纯中文操作界面,一对一技术支持,厂商级的技术服务,共同造就了这款国际顶级控件套包。您对ComponentOne 产品的任何技术问题,都有技术支持工程师提供1对1专业解答,点击此处即可发帖提问>> 技术支持论坛

December 19, 2018 · 1 min · jiezi

【Visual Studio 扩展工具】使用ComponentOne中的属性保存和还原布局

概述在此前的ComponentOne中,我们为C1FlexGrid(最快,最灵活的.Net数据网格控件)添加了一个非常强大的动态分组功能,这篇技术博客《将动态分组添加到.NET表格控件FlexGrid中》是通过GroupDescriptions属性为我们演示了此功能。 随着ComponentOne Enterprise 2018v3版本的正式发布,ComponentOne For WinForm 中的C1Flexgrid又向前推进了两个新属性:GroupDefinition和SortDefinition。GroupDefinition和SortDefinition的用例目前,C1FlexGrid允许您在GroupPanel上拖动列,实现在运行时执行分组。 但是,如果您希望将网格再次恢复到相同的分组状态,该怎么办? 例如,如果您需要按区域分析销售信息,则可以将Country和City列拖到GroupPanel,对数据进行分类并分析信息。 但是,如果其他人必须执行相同的分析,或者您需要在下次访问时继续从同一状态继续,则您希望C1Flexgrid以特定间隔保存您的分类,然后将网格恢复为相同状态。这就是GroupDefinition属性派上用场的地方。同样,如果需要以动态预定义排序状态设置网格,则SortDefinition是您应该查找的属性。如何使用这两个新属性1.GroupDefinition:获取/设置包含C1FlexGrid分组状态的XML格式的字符串。Save:使用GroupDescriptions属性对网格进行分组或通过在C1FlexGridGroupPanel上拖动列后,可以使用GroupDefinition属性保存C1FlexGrid的分组状态,如下所示:Properties.Settings.Default.GroupInfo = _flexgrid.GroupDefinition;此属性以XML格式保存组信息,如下所示: <GroupDescriptions> < GroupDescription PropertyName = “ShipCountry” SortDirection = “Ascending” Group = “True” /> < GroupDescription PropertyName = “ShipCity” SortDirection = “Ascending” Group = “True” /> < GroupDescription PropertyName = “ShipName” SortDirection = “Ascending” Group = “False” /> </GroupDescriptions>Load:在用户设置等某个位置保存状态后,您可以通过分配“组定义”属性来使用此信息加载相同的组状态,如下所示: _flexgrid.GroupDefinition = Properties.Settings.Default.GroupInfo;2.SortDefinition:获取/设置包含C1FlexGrid排序状态的XML字符串。Save:在对单个/范围的网格列进行排序后,通过设置列的Sort属性或单击列标题,可以使用SortDefinition属性保存C1FlexGrid的排序状态,如下所示:Properties.Settings.Default.SortInfo = _flexGrid.SortDefinition;此属性以XML格式保存组信息,如下所示:<ColumnsSort> < ColumnSort ColumnIndex = “0” ColumnName = “ShipCountry” Sort = “Ascending” /> < ColumnSort ColumnIndex = “1” ColumnName = “ShipCity” Sort = “Ascending” /> < ColumnSort ColumnIndex = “2” ColumnName = “ShipName” Sort = “Ascending” /></ColumnsSort>Load :保存排序信息后,可以使用它将网格恢复为相同的排序状态,如下所示:_flexgrid.SortDefinition = Properties.Settings.Default.SortInfo;我们希望 ComponentOne 中增加的新属性使您更方便地保存和加载组/排序状态,也同样希望 ComponentOne 能为您带来更敏捷的开发体验。ComponentOne Enterprise | 下载试用ComponentOne是一款专注于企业应用高性能开发的 .NET 全功能控件套包,包含300余种控件,支持7大平台,涵盖7大功能模块。较于市面上其他同类产品,ComponentOne更加轻盈,功能更加强大,20多年的开发经验,将为您的应用系统带来更为安全的使用体验。纯中文操作界面,一对一技术支持,厂商级的技术服务,共同造就了这款国际顶级控件套包。您对ComponentOne 产品的任何技术问题,都有技术支持工程师提供1对1专业解答,点击此处即可发帖提问>> 技术支持论坛 ...

December 17, 2018 · 1 min · jiezi

【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析

概述迷你图 —— Sparklines是迷你的轻量级图表,有助于快速可视化数据。 它们是由数据可视化传奇人物Edward Tufte发明的,他将其描述为“数据密集,设计简单,字节大小的图形。”虽然迷你图不包含传统图表中的许多元素(如轴和坐标), 基于它们的简单性,它们可以比其他图表类型更具信息性。 由于其紧凑的尺寸,迷你图可以轻松嵌入数据网格或仪表板中,以显示一系列价值观的趋势,例如销售数据、天气或股票市场。Sparklines in FlexGrid将迷你图用于数据网格是很常见的,因为它们为表格数据添加了丰富的可视化功能,而不会占用太多空间。 随着ComponentOne 2018 v3的到来,FlexGrid控件提供了在网格列中显示迷你图的功能。 让我们通过一个非常常见的用例来理解这个功能 —— 分析特定月份不同公司的股票趋势。使用迷你图可视化分析股市趋势迷你图提供即时趋势信息。 这正是股市分析师所需要的 —— 即时趋势的金融数据。在上面的示例中,该网格数据显示了2018年10月份不同公司的股票信息,包含最近一周的交易量(过去7天的交易量)、前一周交易量(前7天的交易量)、超过一周的交易量(原始和百分比)以及整个月的交易量趋势。现在,我们来看看如何在FlexGrid中实现它。创建迷你图表绑定到数据源将FlexGrid绑定到包含表示数字集合的字段的数据源。 例如,实现IEnumerable或INotifyCollectionChanged接口的字段,如Array,List或ObservableCollection。我们将网格绑定到一个包含以下内容的数据源:有关最新周交易量、前一周交易量、两者之间的变化和百分比变化的信息,以及10月份不同公司的交易量数字集合。一旦绑定了数据网格,就可以深入探索我们需要使用的属性,以便在FlexGrid中显示迷你图。使用ShowSparkline和Sparkline属性引入了Column类的ShowSparkline和Sparkline属性,以便在集合所代表的数据的相应单元格中显示迷你图。 因此,为了可视化一个月交易量的趋势,只需将列的ShowSparkline属性设置为true,如图所示。Column volumeTrendCol = c1FlexGrid1.Cols[“VolumeValues”];volumeTrendCol.Caption = “Volume Trend Last 31 days\n as of 31-10-2018”;//Set the Column’s ShowSparkline property to true to show sparklines in that columnvolumeTrendCol.ShowSparkline = true;您可以选择三种不同类型的迷你图,即Column,Line和WinLoss,以便在不同的上下文中可视化数据。线条迷你图、列迷你图和WinLoss迷你图例如,线条迷你图适用于可视化连续数据,例如销售数据。 列迷你图用于涉及数据比较的场景,例如,比较特定年份的月利润。同样,WinLoss迷你图最好用于可视化真假判断(即取得胜利)场景,例如,跟踪体育赛季。在这里,由于我们有连续数据(一个月的交易量),因此我们将使用线型迷你线。 为了设置sparkline类型,您需要使用Column类的Sparkline属性检索Sparkline对象。然后,将检索到的对象的SparklineType属性设置为SparklineType.Line。 您还可以使用标记突出显示迷你图上的各个数据点,以使其更具可读性。 例如,要突出显示迷你图中的最高和最低交易量值,请将Sparkline类的ShowHigh和ShowLow属性设置为true,如下所示://Sets the type of SparklinevolumeTrendCol.Sparkline.SparklineType = SparklineType.Line;//Highlight the highest and the lowest data pointsvolumeTrendCol.Sparkline.ShowHigh = true;volumeTrendCol.Sparkline.ShowLow = true;您还可以使用不同的样式选项更改迷你图的外观。Sparklines的样式FlexGrid控件的命名空间[C1.Win.C1FlexGrid]提供了一个名为SparklineStyles的类,它可以自定义Sparkline的外观,例如轴的颜色、数据点的颜色、迷你图主题颜色等。 此外,还可以更改迷你图轴距、不同系列图距、 winloss迷你图中两条线之间的距离,以及迷你图中线条的粗细。点击此处,下载示例Demo,您可以亲自尝试一下 ComponentOne 迷你图。ComponentOne Enterprise | 下载试用ComponentOne是一款专注于企业应用高性能开发的 .NET 全功能控件套包,包含300余种控件,支持7大平台,涵盖7大功能模块。较于市面上其他同类产品,ComponentOne更加轻盈,功能更加强大,20多年的开发经验,将为您的应用系统带来更为安全的使用体验。纯中文操作界面,一对一技术支持,厂商级的技术服务,共同造就了这款国际顶级控件套包。您对ComponentOne 产品的任何技术问题,都有技术支持工程师提供1对1专业解答,点击此处即可发帖提问>> 技术支持论坛 ...

December 17, 2018 · 1 min · jiezi

ComponentOne 产品经理:为什么要从C1Report迁移到FlexReport

概述如果你正在使用ComponentOne Enterprise 的Reports for WinForm 报表控件(C1Report),你一定会喜欢更为强大的FlexReport!FlexReport是一个改进的C1Report,使.NET开发人员能够根据应用程序的业务需求解决复杂问题。 借助ComponentOne的2018v2版本,FlexReport提供了创建复杂报表的能力。 FlexReport的架构建立在C1Report之上,因此您将快速掌握C1Report以及其他一些用法。 FlexReport代码是从头开始编写的; 因此,在从C1Report迁移到FlexReport时,您会发现API中的以下重大更改。ComponentOne技术团队现在鼓励C1Report用户将他们的报表迁移到FlexReport,这样就可以获得更快的数据处理能力和更轻量的产品架构。从C1Report迁移到FlexReport的五大理由FlexReport比C1Report快两倍。FlexReport的新架构和后续更新架构有助于支持常见的布局功能,例如并排分页两个子报表等。FlexReport对象模型类似于C1Report,因此针对C1Report的大多数简单代码都可以在FlexReport中使用。FlexReport提供了段落字段、排序、计算字段和添加多个数据源等新功能。 参数更容易添加和编辑。 使用捕捉线、标题、部分轻松添加字段和设计报表 - 这些都在设计器中,因此您无需对其进行任何编码。FlexReport是一种跨平台解决方案。 它不依赖于WinForms / GDI +。 相反,新引擎的渲染基于DirectX / DirectWrite,并且应该相对容易移植到XAML / UWP平台并在这些平台上呈现更好。 FlexReport可在Winform,WPF和UWP平台中使用。FlexReport性能改进我们在许多标准用例上测试了FlexReport和C1Report,以证明性能的提升。 了解有关FlexReport的更多信息,并将其性能与C1Report进行比较。此表提供FlexReport和C1Report功能比较:准备从C1Report迁移到FlexReport?按照这个步骤将基于C1Report的报表迁移到FlexReport吧!ComponentOne Enterprise | 下载试用ComponentOne是一款专注于企业应用高性能开发的 .NET 全功能控件套包,包含300余种控件,支持7大平台,涵盖7大功能模块。较于市面上其他同类产品,ComponentOne更加轻盈,功能更加强大,20多年的开发经验,将为您的应用系统带来更为安全的使用体验。纯中文操作界面,一对一技术支持,厂商级的技术服务,共同造就了这款国际顶级控件套包。您对ComponentOne 产品的任何技术问题,都有技术支持工程师提供1对1专业解答,点击此处即可发帖提问>> 技术支持论坛

December 17, 2018 · 1 min · jiezi