杨柳依依

杨柳依依 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

杨柳依依 发布了文章 · 2月23日

在Visual Studio中创建一个新的ASP.NET项目

jQuery Gantt Package是一个真正的跨平台,基于HTML5 / jQuery的本地实现,具有2个不同的gantt小部件,可满足您所有基于gantt的可视化需求。还带有ASP.NET WebControl和MVC扩展,可轻松集成到现有应用中。

在Visual Studio中创建一个新的ASP.NET项目:

VS 2012 :FILE --> New --> Project --> Installed --> Templates --> Other Language --> TypeScript,创建一个项目。

甘特包包括必要的甘特TypeScript接口,以帮助你开发你的Web应用程序,就像其他类型安全语言一样,编译时检查。

1) Gantt Widget源码JS文件

首先,你需要甘特小部件所需的JS源文件。这些文件在<安装路径>/Src文件夹中。把这个文件夹复制到上面的Project文件夹里面(虽然这个文件夹的大小非常大,但是它包含了所有Themes、locales等所需要的CSS等,并不是所有的CSS都会被加载到你的页面里面)。

继续删除这个Src文件夹里面的bin文件夹。

然后在项目的解决方案资源管理器中点击 "显示所有文件 "工具条项来显示这个新包含的Src文件夹,并将其包含在项目中。

**

2)实用JS文件样本

**一些带有实用功能的JS文件,可以在网格中进行内嵌编辑等,这些文件在<install path>/Samples/Scripts文件夹中。将上述安装路径中的Scripts文件夹的内容复制到你的项目文件夹中的Scripts文件夹中(当你创建一个新项目时,项目文件夹中会自动创建一个Scripts文件夹)。
然后按照上一步的步骤将新添加的脚本文件包含到你的项目中。

3) JSON数据样本

创建一个SampleData.json文件,其中包含要在甘特图中显示的示例任务列表。

SampleData.json内容:

[{

"Name" : "Task 1",
"ID" : 1,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "8:00:00",
"Description" : "Description of Task 1"

},
{

"Name" : "Task 2",
"ID" : 2,
"PredecessorIndices" : "1",
"StartTime" : "2012-02-03T00:00:00Z",
"Effort" : "16:00:00",
"Description" : "Description of Task 2"

},

{

"Name" : "Task 3",
"ID" : 3,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "1.12:30:00",
"ProgressPercent" : 90,
"Description" : "Description of Task 3"     

},

{

"Name" : "Child Task 1",
"ID" : 4,
"IndentLevel" : 1,
"StartTime" : "2012-02-03T00:00:00Z",
"Effort" : "8:00:00",
"ProgressPercent" : 75,
"Description" : "Description of Task 3/Child Task 1"

},

{

"Name" : "Child Task 2",
"ID" : 5,
"IndentLevel" : 1,
"PredecessorIndices" : "4+8",
"Description" : "Description of Task 3/Child Task 2"

},

{

"Name" : "Grand Child Task 1",
"ID" : 6,
"IndentLevel" : 2,
"StartTime" : "2012-02-03T00:00:00Z",
"Effort" : "8:00:00",
"Description" : "Description of Task 3/Child Task 1/Grand Child 1"

},
{

"Name" : "Grand Child Task 2",
"ID" : 7,
"IndentLevel" : 2,
"StartTime" : "2012-02-03T00:00:00Z",
"Effort" : "16:00:00",
"Description" : "Description of Task 3/Child Task 1/Grand Child 2"

},

{

"Name" : "Child Task 3",
"ID" : 8,
"IndentLevel" : 1,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "16:00:00",
"Description" : "Description of Task 3/Child Task 3"

},

{

"Name" : "Task 4",
"ID" : 9,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "00:00:00",
"ProgressPercent" : 60,
"Description" : "Description of Task 4"

},

{

"Name" : "Task 5",
"ID" : 10,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "8:00:00",
"PredecessorIndices" : "3+8",
"Description" : "Description of Task 5"  

},

{

"Name" : "Child Task 1",
"ID" : 11,
"IndentLevel" : 1,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "16:00:00",
"Description" : "Description of Task 5/Child Task 1"

},

{

"Name" : "Child Task 2",
"ID" : 12,
"PredecessorIndices" : "11SS",
"IndentLevel" : 1,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "8:00:00",
"Description" : "Description of Task 5/Child Task 2"

},

{

"Name" : "Task 6",
"ID" : 13,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "1.16:00:00",
"Description" : "Description of Task 6" 

},

{

"Name" : "Child Task 1",
"ID" : 14,
"IndentLevel" : 1,
"StartTime" : "2012-02-02T00:00:00Z",
"Effort" : "1.20:00:00",
"Description" : "Description of Task 6/Child Task 1"  

},

{

"Name" : "Grand Child Task 1",
"ID" : 15,
"StartTime" : "2012-02-04T00:00:00Z",
"Effort" : "1.00:00:00",
"IndentLevel" : 2,
"Description" : "Description of Task 6/Child Task 2"

}]

4)包含甘特小部件的HTML文件

在你的项目中创建一个新的HTML文件,并引用以下源文件。记得在下面最后一个引用中链接到正确版本的RadiantQ jQuery Gantt。

<head>

<title></title>
<link href="Src/Styles/jQuery-ui-themes/smoothness/jquery-ui.css" rel="stylesheet" />
<link href="Src/Styles/radiantq.gantt.default.css" rel="stylesheet" />
<link href="Src/Styles/VW.Grid.css" rel="stylesheet" />
<script data-original="Src/Scripts/jquery-1.11.2.min.js" type="text/javascript"></script>
<script data-original="Src/Scripts/jquery-ui-1.11.4/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript" data-original="Src/Scripts/jquery.layout-latest.min.js"></script>
<script data-original="Src/Scripts/Utils/date.js" type="text/javascript"></script>
<script data-original="Src/ResourceStrings/en-US.js" type="text/javascript"></script>
<script data-original='Src/Scripts/VW.Grid.1.min.js' type='text/javascript'></script>
<script data-original='Src/Scripts/RadiantQ-jQuery.gantt.5.0.trial.min.js' type='text/javascript'></script>

</head>

<body>

<div id="pagecontent" style="height: 600px;">
    <div id="gantt_container" style="height: 100%;">
    </div>
</div>

</body>

5)TypeScript文件

在你的项目中,在该HTML旁边添加一个新的TypeScript文件(myApp.ts),并引用html中的结果js。

<head>

other script fils.
<script data-original=myApp.js type='text/javascript'></script>

</head>

6)在TypeScript文件里面创建Ganttcontrol小部件。

$.ajax({

type: "GET",
dataType: 'json',
url: 'GanttControlSkeleton.json',
converters:
{
    "text json": function (data) {
        //console.log(data);
        return $.parseJSON(data, true
        /*converts date strings to date objects*/
            , true
        /*converts ISO dates to local dates*/
            );
    }
},
success: function (data) {
    loadGantt(data);
}

});
function loadGantt(datasourcejson) {

var columns = [
        {
            field: "Activity_M().ID_M()",
            title: "ID",
            width: 20
        },
        {
            field: "Activity_M().ActivityName_M()",
            title: "Activity Name",
            width: 200,
            editor: RadiantQ.Default.Template.ProjectGanttExpandableTextboxEditor(),
            template: RadiantQ.Default.Template.ProjectGanttExpandableTextBlockTemplate()
        },
        {
            field: "Activity_M().StartTime_M()",
            title: "StartTime",
            width: 100,
            format: "MM/dd/yy",
            cellalign: "center",
            editor: "<input data-bind=' ValueBinder.ActivityTimeBinder:Activity_M().StartTime_M' />"
        },
        {
            field: "Activity_M().EndTime_M()",
            title: "EndTime",
            width: 100,
            format: "MM/dd/yy",
            cellalign: "center",
            editor: "<input data-bind='value:Activity_M().EndTime_M' data-getvalueName='getDate' data-setvaluename='setDate'                  data-valueUpdate='onBlur'  data-role="DateTimePicker"  />"
        },
        {
            field: "Activity_M().Effort_M()",
            title: "Effort",
            format: "" /*to call the .toString()*/,
            width: 100,
            editor: "<input data-bind='value:Activity_M().Effort_M' style='height:18px'  data-role="DurationPicker"  />"
        },
        {
            field: "Activity_M().ProgressPercent_M()",
            title: "ProgressPercent",
            width: 100,
            editor: "<input style='height:18px'  data-bind='value:Activity_M().ProgressPercent_M' data-role="spinner"                       data-options='{"min":0, "max": 100}' />"
        },
        {
            field: "Activity_M().Assignments_M()",
            title: "Assignments",
            iseditable: false,
            template: '<div> ${                 RadiantQ.Gantt.ValueConverters.ConverterUtils.GetResourcesText(data.Activity_M().Assignments_M(), false) }                        </div>',              
            width: 200
        },
        {
            field: "Activity_M().PredecessorIndexString_M()",
            title: "PredecessorIndex",
            template: "<div>${data.PredecessorIndexString || '' }</div>",
            editor: "<input data-bind='value:PredecessorIndexString'/>",
            width: 150
        }
    ];
var ganttControl: GanttControl;
var anchorTime = datasourcejson[0].StartTime["clone"]();
var $gantt_container = $('#gantt_container');
$gantt_container.GanttControl({
    ProjectStartDate: anchorTime,
    DataSource: datasourcejson,
    GanttTableOptions: {
            columns: columns

    },
    IDBinding: new RadiantQ.BindingOptions("ID"),
    NameBinding: new RadiantQ.BindingOptions("Name"),
    IndentLevelBinding: new RadiantQ.BindingOptions("IndentLevel"),
    StartTimeBinding: new RadiantQ.BindingOptions("StartTime"),
    EffortBinding: new RadiantQ.BindingOptions("Effort"),
    PredecessorIndicesBinding: new RadiantQ.BindingOptions("PredecessorIndices"),
    ProgressPercentBinding: new RadiantQ.BindingOptions("ProgressPercent"),
    DescriptionBinding: new RadiantQ.BindingOptions("Description"),
    TimeRangeHighlightBehavior: RadiantQ.Gantt.TimeRangeHighlightBehavior.HighlightInChartOnHeaderMouseHover,
    GanttChartTemplateApplied: function (sender , args) {
        ganttControl = <GanttControl>$gantt_container.data("GanttControl");
        var $ganttChart = args.element;
        $ganttChart.GanttChart({ AnchorTime: anchorTime });
    }
});

};

最后,看看这个主题,告诉你如何清理项目中的Src文件夹,删除不必要的文件。

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月23日

如何在不使用Internet Explorer的Delphi中将报表导出到DropBox(OAuth 2.0)

AnyChart是基于JavaScript (HTML5) 的图表控件。使用AnyChart控件,可创建跨浏览器和跨平台的交互式图表和仪表。AnyChart 图表目前已被很多知名大公司所使用,可用于仪表盘、报表、数据分析、统计学、金融等领域。

四个新的令人敬畏的数据可视化示例灵感— DataViz Weekly

数据可视化是我们的激情,我们很高兴有五位共享它的人!欢迎来到DataViz Weekly!对于你们所有人,我们还组织了另外四个值得一试的新的很棒的交互式数据可视化项目。浏览下面的列表,然后仔细看一下:

  • 2020-2021休赛期的WorldTour换乘活动-Carrie Bennette
  • 2020年美国大选的区域地图-效果图
  • 随着时间的推移,美国参议院中的几代人代表了— wcd.fyi
  • 伦敦健康街道指数— _STREETS

2020-2021休赛期的世界巡回赛转会

**2020-2021休赛期的世界巡回赛转会
**

数据科学家和数据可视化设计师Carrie Bennette创建了一个有趣的Sankey图,它可以激发自行车赛车迷的兴趣。该图代表了在最近的休赛期UCI WorldTour(国际男子公路自行车巡回赛)上进行的所有接送。

该图表在显示团队及其实力如何变化方面做得很好。根据ProCyclingStats(PCS)点数对团队进行排序,顶部为2020,底部为2021。节点之间的线代表各个骑手。线的宽度对应于每个骑手的PCS排名。该图是交互式的,您可以将鼠标悬停在流和节点上以查看更多详细信息。

找出在这个WorldTour转会赛季结束后,谁移动了位置以及哪些团队成功获得了更高的排名。

2020年大选区地图

**2020年大选区地图
**

《纽约时报》的《Upshot》刊登了2020年大选的“极其详尽”的选区地图。它代表了42个州中1,922个县(共3,143个)的县级投票结果,并随着新数据的到来而不断更新。

除了2020年的结果之外,该地图还允许您通过可视化投票保证金变动来调查2016年以来的变化。从这个角度来看,它极大地显示了郊区发生的事情。看看亚特兰大(如上图),菲尼克斯和匹兹堡,这是最明显的例子,其中蓝移趋势非常明显。

探索有关美国如何投票的详细信息。如果您想查看更多的选举地图,请不要错过我们的特别版,《20多个可视化2020年美国总统选举结果的选举地图》。

随着时间的推移,美国参议院中年龄段的代表

**随着时间的推移,美国参议院的代议制
**

在查看2020年大选后美国参议院的变化时,我们不要错过一件与政党关系不大的重要事情。第一个千禧一代到了!来自佐治亚州的33岁的乔恩·奥索夫(Jon Ossoff)是有史以来第一位参议员。在wcd.fyi的这个简单但酷的可视化中,您可以看到他被表示为孤独的粉红色瓷砖。

图表可视化,美国参议院的一段时间,因为1947年基础上从ProPublica国会API数据的代击穿。一瓦就是一名参议员-将鼠标悬停在其上即可查看姓名,年龄等。

参见参议院的代际转变。在图表下方,您可以了解其构建方式以及查找备用表格视图的方法。

伦敦健康街道指数

**伦敦健康街道指数
**

_STREETS研究小组发布了一张互动地图,一目了然,显示了伦敦市中心每条街道的健康程度。可视化基于“健康街道指数”得分,该得分总结了十个城市环境和体验指标-空气质量,噪声水平,交通优势,停车和休息场所的可利用性,看和做的事情等等。综合考虑这些因素,可以确定一条街道的步行,骑行和消磨时间的状况。

使用红色(低)到黄色(中)到绿色(高)的传统调色板显示每条街道的“健康街道指数”分数。

该项目目前仅适用于伦敦市中心。但是作者已经在努力扩展它,首先覆盖整个英国,然后走向国际。一探究竟。

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月23日

dhtmlxGantt如何重新排序任务

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。它允许你创建动态甘特图,并以一个方便的图形化方式可视化项目进度。有了dhtmlxGantt,你可以显示活动之间的依赖关系,显示具有完成百分比阴影的当前任务状态以及组织活动到树结构。

重新排序任务

dhtmlxGantt提供了两种在网格中对任务进行重新排序的方法:

  1. 拖放
  2. 排序

这些方法是替代的。默认情况下,两种模式都是禁用的。

要启用拖放重排序,请使用order_branch选项:

gantt.config.order_branch = true;
gantt.init("gantt_here");

您可以看一下视频指南,该指南显示了如何在网格中对任务进行排序和重新排序。

在整个甘特结构中拖放

该order_branch选项允许同一树级别中拖动任务。

也可以启用可以在整个甘特图中重新排序任务的模式。这意味着一个任务可以替换任何树级别的另一个任务。要使用这种类型的任务重新排序,请使用order_branch_free选项:

// reordering tasks within the whole gantt
gantt.config.order_branch = true;
gantt.config.order_branch_free = true;

gantt.init("gantt_here");

拒绝掉到特定位置

要拒绝将任务放到特定位置,请使用onBeforeTaskMove或onBeforeRowDragEnd事件:

//prevent moving to another sub-branch:
gantt.attachEvent("onBeforeTaskMove", function(id, parent, tindex){

var task = gantt.getTask(id);
if(task.parent != parent)
    return false;
return true;

});

//or
gantt.attachEvent("onBeforeRowDragEnd", function(id, parent, tindex){

var task = gantt.getTask(id);
if(task.parent != parent)
    return false;
return true;

});

改善大型数据集的性能

如果您的甘特图中包含很多任务,则分支重排序的默认模式可能会降低性能。为了加快速度,您可以使用“标记”模式。

gantt.config.order_branch = "marker";

在此模式下,仅将任务名称重新排序(按住鼠标左键),并且仅当将任务放在目标位置时(释放键)才重新渲染甘特图。与默认模式不同,更改任务位置不涉及触发onBeforeTaskMove / onAfterTaskMove事件。

为防止任务掉落到特定位置,请改用onBeforeRowDragMove事件(仅在“标记”模式下有效)。

拖放时突出显示可用放置位置

要在拖动过程中突出显示可用的目标位置(例如,不可能将根节点拖动到另一个根目录下,并且您想在视觉上通知用户此信息),请使用onRowDragStart和onRowDragEnd事件:

gantt.config.order_branch = true;// order tasks only inside a branch
gantt.init("gantt_here");
gantt.parse(demo_tasks);

var drag_id = null;
gantt.attachEvent("onRowDragStart", function(id, target, e) {

drag_id = id;
return true;

});
gantt.attachEvent("onRowDragEnd", function(id, target) {

drag_id = null;
gantt.render();

});

gantt.templates.grid_row_class = function(start, end, task){

if(drag_id && task.id != drag_id){
    if(task.$level != gantt.getTask(drag_id).$level)
        return "cant-drop";
    }
return "";

};

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月23日

常用甘特图软件测评!助你找到合适的项目管理工具

甘特图(Gantt chart)又称为横道图、条状图(Bar chart),以提出者亨利·劳伦斯·甘特(Henry Laurence Gantt)先生的名字命名。甘特图通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况,项目进度一目了然。可帮助用户快速的整合项目管理软件所需的甘特图,网络图,资源柱状图,日程日历,资源调度等功能模块,并提供全方位的支持和服务。目前市面上有很多甘特图产品,现在就来看看常用的、可定制开发的甘特图吧!

1、VARCHART XGantt

[VARCHART XGantt]是全球知名的甘特图控件,用于ActiveX、.Net等平台,能够实现如 Microsoft Project 般强大的项目管理功能。以甘特图、柱状图的形式来编辑、打印以及图形化的表示您的数据,可以快速、简单地将数据集成到您的应用程序中,帮助您识别性能瓶颈、避免延迟以及高效利用资源,使复杂数据变得更加容易理解。广泛应用于项目管理、生产排程、资源调度等业务场景。

产品特点:

  • 功能全面,满足高端定制需求
  • 拥有完美的数据兼容与交互
  • 支持与所有主流数据库无缝整合
  • 拥有上千个接口,满足各种二次开发需求
  • 无限分发,降低成本
  • 复杂业务场景的支持

2、dhtmlxGantt

[dhtmlxGantt]是用于跨浏览器和跨平台应用程序的功能齐全的JavaScript / HTML5甘特图,允许你创建动态甘特图,并以一个方便的图形化方式可视化项目进度。有了dhtmlxGantt,你可以显示活动之间的依赖关系,显示具有完成百分比阴影的当前任务状态以及组织活动到树结构。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。

产品特点:

  • 功能强大,价格较低
  • 支持所有主要浏览器
  • 提供丰富灵活的JavaScript API,满足定制需求
  • 直观的用户界面,轻松更改任务时间
  • 可与不同的框架和技术一起使用
  • 跨浏览器和跨平台

3、AnyGantt

[AnyGantt]是基于JavaScript的高级数据可视化解决方案,使每个人都可以利用动画的力量和最终的交互性。AnyGantt是构建复杂且内容丰富的甘特图的理想工具。您可以通过一个简单得XML配置文件来生成组、连接点和转折点。

产品特点:

  • 体积小、速度快、效果好
  • 授权方式灵活,价格较低
  • 同时支持项目和资源图表
  • 丰富的视觉设置和数据网格控件
  • 支持完全跨平台和跨浏览器,兼容多种脚本语言
  • 使用XML作为数据接口,支持多种的数据源

4、jQuery Gantt Package

[jQuery Gantt Package]是一个真正的跨平台,基于HTML5 / jQuery的本地实现,功能丰富,可满足您所有基于gantt的可视化需求的控件包,可帮您实现工业4.0生产任务分层列表的可视化,及资源利用视图。还带有ASP.NET WebControl和MVC扩展,可轻松集成到现有应用中。

产品特点:

  • 拥有丰富的内置编辑功能,实现任务分层可视化
  • 跨平台支持浏览器和设备
  • 与所有流行的JS框架兼容
  • 提供可定制的调度功能、资源分配及资源调配功能

5、phGantt Time Package

[phGant Time Package]集合了一批优秀的时间块处理控件,能为应用程序加入甘特图表设计和日程计划设计的功能。利用该控件包可以方便的为你的工程或者是特定的某个人制定详细的工作计划,并能直观的显示和解决一些即将发生的或已经发生的事务的时序安排问题。

产品特点:

  • 兼容各种支持ActiveX的平台、.NET的环境
  • 分层时间,可视化紧凑时间表
  • 通过简单的配置即可实现甘特图功能集成
  • 制定详细工作计划,解决事务的时序安排问题
查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月22日

以编程方式设置用于从FastReport.Net发送默认电子邮件客户端设置

[FastReport .Net]是适用于Windows Forms,ASP.NET,MVC和.NET Core的全功能[报表]解决方案。它可以在Microsoft Visual Studio 2005-2019中使用。支持.Net Framework 2.0-4.x,.NET Core 3.0及以上版本。

在FastReport .NET 2021.1的新版本中,我们实现了对.NET 5的支持。添加了新条形码-Deutsce Post Leitcode。将RTF转换为报告对象的算法已得到显着改进。并且还添加了用于转换数字的新功能。

与许多其他报告生成器一样,FastReport.Net允许您通过电子邮件以任何可用的导出格式发送报告。您可以在报告预览模式或自定义应用程序代码中发送电子邮件。

要发送电子邮件,您需要设置发件人,收件人设置。

在“帐户”选项卡上,设置用于发送电子邮件的电子邮件客户端设置以及发件人的地址和名称。

FastReport.NET

在“电子邮件”选项卡上,设置收件人的地址,电子邮件主题,电子邮件文本,最重要的是要附加到电子邮件的报告格式。发送电子邮件后,报告将以指定的格式自动导出并附加到电子邮件中。 

FastReport.NET

您设置的任何设置都会在发送电子邮件时保存为默认设置,以后您可以使用它们。在EnvironmentSettings组件的应用程序代码中初始化电子邮件设置值时,情况也是如此。仅在发送电子邮件后才保存设置。但是,如果您希望立即应用默认电子邮件设置,而不必发送电子邮件来保存它们怎么办?如果您在多用户应用程序中使用报告生成器并希望进行邮件预设,以便用户仅需输入收件人地址并单击“发送”按钮,这可能会很有用。

默认电子邮件设置位于FastReport.Net报表生成器配置文件中,该文件通常位于指定的路径中

C:UsersUserAppDataLocalFastReportFastReport.config.

在文本编辑器中打开此文件,您将看到一个xml。找到“帐户设置”部分,如果您已经从预览模式发送邮件,则将看到用于发送邮件的默认设置。要在自定义应用程序中编辑此文件,请使用以下代码:

XmlItem xi = Config.Root.FindItem("EmailExport").FindItem("AccountSettings");
// save account info
xi.SetProp("Address", "a@a.com");
xi.SetProp("Name", "Name");
xi.SetProp("Template", "template");
xi.SetProp("Host", "host");
xi.SetProp("Port", "25");
xi.SetProp("UserName", "UserName");
xi.SetProp("Password", "Password");
xi.SetProp("EnableSSL", "1"); // "0" if SSL needs to be disabled

在这段代码中,我们阅读了配置文件并找到了邮件设置部分。然后-我们进行设置。如果此部分或其属性不在配置中,则会自动添加它们。

这样,我们可以为用户创建预配置的邮件设置。

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月22日

报表生成工具FastReport.Mono v2021.1发布!添加了转换数字的新功能

[FastReport.Mono] 是一款为Mono Framework设计的功能全面的报表生成工具。FastReport.Mono 是一个多平台的报表解决方法。它可以应用于Windows, Linux, Mac OS X,以及任何支持Xamarin Mono的操作系统。

在FastReport Mono 2021.1的新版本中,添加了新条形码-Deutsche Post Leitcode。将RTF转换为报告对象的算法已得到显着改进。并且还添加了用于转换数字的新功能。欢迎下载体验。(点击下方按钮下载)

FastReport Mono 2021.1

[Engine]

  • 添加了新条形码-Deutsche Post Leitcode
  • 添加了新条形码-SberBank QR
  • 添加了将数字转换为字母的功能
  • 添加了转换的功能数字到印度语言的单词
  • 印度货币增加的卢比符号
  • 波斯语言
  • 增加了将数字转换成单词的功能
  • 乌克兰语增加了将数字转换成单词的功能+添加了Report.Prepare(int pagesLimit)方法,该方法允许准备乐队的VisibleExpression,PrintableExpression和ExportableExpression属性的有限页面*优化工作
  • 优化了乐队的VisibleExpression,PrintableExpression和ExportableExpression属性
  • 改进了将RTF转换为报表对象的算法
  • 修复了在连接到远程JSON时使用Web响应流阅读器的错误
  • 修复了在VisibleExpression属性中使用某些表达式编译报表时的错误,PrintableExpression和ExportableExpression-
  • 修复了font.list文件的一个错误,该错误导致异常“ System.IO.FileNotFoundException”。
  • 修复了Deutsche Post Identcode条形码中校验和计算不正确的错误
  • 修复了ReCompile(编译后添加有错误的程序集)
  • 修复了在Linux操作系统下打印的错误

[Designer]

  • 修复了重新加载报告后数据库名称为空的错误
  • 修复了在报告选项卡上双击箭头按钮创建新报告页面时的错误

[Exports]

  • 修复了在DXF导出中导出仅包含空格的字符串的错误
  • 修复了PDF导出中的错误,导致报表中有选项卡时空格消失
  • 修复了在导出到Excel 2007中时导出页面页脚的错误无缝表模式
  • 修复了在Excel 2007导出中导出“ ”字符的错误

[WebReport]

  • 在ScriptSecurity模式下添加了脚本错误的正确视图
  • 修复了在线设计器中PDF导出的错误
  • 修复了ParagraphOffset的错误

[资源]

  • 更新了法语资源
查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月22日

配置FastReport.Net环境教程

[FastReport .Net]是适用于Windows Forms,ASP.NET,MVC和.NET Core的全功能报表解决方案。它可以在Microsoft Visual Studio 2005-2019中使用。支持.Net Framework 2.0-4.x,.NET Core 3.0及以上版本。

在FastReport .NET 2021.1的新版本中,我们实现了对.NET 5的支持。添加了新条形码-Deutsce Post Leitcode。将RTF转换为报告对象的算法已得到显着改进。并且还添加了用于转换数字的新功能。欢迎下载体验。(点击下方按钮下载)

输出报告

准备好的报告可以导出为支持的格式之一。此刻,可以使用以下格式。

  • PDF格式
  • HTML
  • RTF
  • Excel XML (Excel 2003+)
  • Excel 2007
  • CSV
  • TXT
  • OpenOffice计算
  • 图片(Bmp, Png, Jpeg, Gif, Tiff, Metafile)

通过导出过滤器进行导出。要做到这一点:

  • 使用 "准备 "方法准备一个报告。
  • 创建一个export filter的实例并设置其属性。
  • 调用Report对象的Export方法。

下面的示例将一个准备好的报表导出为HTML格式。

// 准备一份报告
report1.Prepare();
// 创建一个HTML导出过滤器的实例
FastReport.Export.Html.HTMLExport export = new FastReport.Export.Html.HTMLExport();
// 显示导出选项对话框并进行导出。
if (export.ShowDialog())
report1.Export(export, "result.html");

在这个例子中,导出设置是通过对话窗口进行的。
配置FastReport.Net环境

使用工具箱中的EnvironmentSettings组件,您可以控制一些FastReport.Net环境设置。要做到这一点,请将该组件放在您的窗体上,并使用属性窗口设置其属性。

EnvironmentSettings.ReportSettings属性包含一些与报表相关的设置。

属性描述

语言默认语言
新报表的默认脚本语言。

bool ShowProgress
决定是否需要显示进度窗口。

bool ShowPerformance
决定是否在预览窗口的右下角显示报表性能信息(报表生成时间、消耗的内存)。

EnvironmentSettings.DesignerSettings 属性包含一些与设计器相关的设置。

属性说明

图标 Icon Icon
设计器窗口的图标。

默认字体
报表中使用的默认字体。

EnvironmentSettings.PreviewSettings 属性包含一些与预览相关的设置。

属性描述

预览按钮
Buttons在预览的工具栏中可见的按钮集。

int PagesInCache
预览时可存储在内存缓存中的准备页数。

bool ShowInTaskbar
确定是否在Windows任务栏中显示预览窗口。

bool TopMost
确定是否应将预览窗口显示为最上面的表格。

Icon Icon

预览窗口的图标。

string Text
预览窗口的文字。如果没有设置文本,将使用默认文本 "预览"。

EnvironmentSettings.EmailSettings 属性包含电子邮件帐户设置。这些设置在预览窗口的 "发送电子邮件 "功能中使用。

属性描述

字符串地址
发件人地址(如您的电子邮件地址)。

字符串名称
发件人名称(如你的名字)。

字符串 MessageTemplate
用于创建新消息的消息模板。例如,"Hello, Best regards, ..."。

字符串 Host
SMTP主机地址。

int 端口
SMTP端口(默认为25)。

串用户名,串密码
用户名和密码。如果您的服务器不需要认证,请将这些属性留空。

bool AllowUI
允许在 "发送邮件 "对话框中更改这些设置。这些设置将存储在FastReport.Net配置文件中。

UI风格的设置在环境设置组件的以下属性中可用。

属性描述

UIStyle UIStyle
设计师的风格和预览形式。有6种风格可供选择--VisualStudio2005、Office2003、Office2007Blue、Office2007Silver、Office2007Black、VistaGlass。
默认的风格是Office2007Black。

bool UseOffice2007Form
此属性会影响设计器和预览表单。它决定了如果选择了以下样式之一,是否应该使用 Office2007 样式的表单。Office2007Blue、Office2007Silver。
Office2007Black,VistaGlass。
默认值为true。

除了这些属性,环境设置组件还有一些事件。使用这些事件,你可以做以下事情。

  • 替换设计器中标准的 "打开文件 "和 "保存文件 "对话框。
  • 替换标准的进度窗口。
  • 将自己的连接字符串传递给报告中定义的连接。

这些任务将在本手册的以下章节中进行描述。

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月22日

推荐这几款主流报表产品

为什么大家现在放弃使用Excel,而选择第三方报表工具呢?

Excel是一个电子表格程序,而不是一个数据库程序。Excel数据处理容量和速度有限制,数据可视化程度不高,都是以表格为主,虽然也能插入一些图表,但是灵活度和美观度不够,设置起来也相当麻烦,并且数据获取麻烦。

第三方报表工具是数据库存储,数据库程序通常可以存放的数据量是相当大的,可以处理非常复杂的数据结构关系。报表数据交互也快捷方便,速度也非常快,可视化交互渲染。

今天与大家探讨不同语言平台有哪些好用的“第三方报表工具”。以及如何用最低的成本获得正版授权!


.NET开发平台

OPC Server

FastReport.NET

FastReport.NET是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案。适用于.NET Core 3,ASP.NET,MVC和Windows窗体的全功能报告库。使用FastReport .NET,您可以创建独立于应用程序的.NET报告。在FastReport .NET 2021.1的新版本中,实现了对.NET 5的支持。

OPC Server

Stimulsoft Reports.Net

[Stimulsoft Reports.Net] 是一个基于.NET框架的报表生成器,能够帮助你创建结构、功能丰富的报表。Stimulsoft Reports.Net的报表设计器不仅界面友好,而且使用便捷,能够让你轻松创建所有报表;该报表设计器在报表设计过程中以及报表运行的过程中都可以使用。使用Stimulsoft Reports.Net,您可以创建基于各种不同数据源的报表。在运行时使用Stimulsoft Reports.Net的报表设计器不需要支付任何的专利费用。

OPC Server

ActiveReports

[ActiveReports]是一款专注于 .NET 和 .NET Core 平台的报表控件,十多年来一直荣获应用程序的优秀报表生成控件。通过拖拽式报表设计器,可以快速地设计 Excel表格、Word文档、图表、数据过滤、数据钻取、精准套打等类型报表,全面满足 WinForm、ASP.NET、ASP.NET MVC、WPF 平台中各种报表的开发需要。同时,通过丰富的 API 可以灵活的实现报表创建、加载和运行时的个性化自定义需求。

OPC Server

DevExpress Reporting

[DevExpress Reporting]是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。


VCL开发平台

OPC Server

FastReport VCL

[FastReport VCL]是用于在软件中集成商务智能的现代解决方案。它提供了可视化模板设计器,可以访问最受欢迎的数据源,报告引擎,预览,将过滤器导出为30多种格式,并可以部署到云,Web,电子邮件和打印中。

OPC Server

QuickReport

[QuickReport]是一个100% 用Delphi 代码编写的分栏报表生成器,它可与Delphi 和C++Builder 完美整合,并且在Delphi/C++Builder IDE 中使用表单设计器作为报表设计器来设计报表。


JavaScript和HTML5开发平台

OPC Server

Stimulsoft Reports.JS

[Stimulsoft Reports.JS]是一个使用JavaScript和HTML5生成报表的平台。它拥有所有拥来设计,编辑和查看报表的必需组件。该报表工具根据开发人员数量授权而不是根据应用程序的用户数量。


Java开发平台

OPC Server

Stimulsoft Reports.Java

[Stimulsoft Reports.Java]是一个专为在Java应用程序中的报表进行交互和处理的报表工具。 Java技术允许在不同的平台、不同的操作系统和不同的硬件上使用程序。正因为这样,Stimulsoft Reports.Java现在几乎在任何地方都可用,同时还是一个拥有高质量的功能和用户友好的报表工具。

C++/Qt开发平台

OPC Server

NCReport

[NCReport]是一个基于Qt跨平台应用程序和UI框架,使用C++编写的强大、快速、多平台、容易使用的报告引擎库、报表生成器、报表设计器、 报表记录器、报表工具、报表解决方案。如果你在寻找Qt报表引擎、Qt报表工具、Qt报表库等等,那么NCReport就是你的最佳选择。并且NCReport兼容Qt5和Qt4.

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月20日

令人敬畏的数据可视化示例灵感

AnyChart是基于JavaScript (HTML5) 的图表控件。使用AnyChart控件,可创建跨浏览器和跨平台的交互式图表和仪表。AnyChart 图表目前已被很多知名大公司所使用,可用于仪表盘、报表、数据分析、统计学、金融等领域。

四个新的令人敬畏的数据可视化示例灵感— DataViz Weekly

数据可视化是我们的激情,我们很高兴有五位共享它的人!欢迎来到DataViz Weekly!对于你们所有人,我们还组织了另外四个值得一试的新的很棒的交互式数据可视化项目。浏览下面的列表,然后仔细看一下:

  • 2020-2021休赛期的WorldTour换乘活动-Carrie Bennette
  • 2020年美国大选的区域地图-效果图
  • 随着时间的推移,美国参议院中的几代人代表了— wcd.fyi
  • 伦敦健康街道指数— _STREETS

2020-2021休赛期的世界巡回赛转会

**2020-2021休赛期的世界巡回赛转会
**

数据科学家和数据可视化设计师Carrie Bennette创建了一个有趣的Sankey图,它可以激发自行车赛车迷的兴趣。该图代表了在最近的休赛期UCI WorldTour(国际男子公路自行车巡回赛)上进行的所有接送。

该图表在显示团队及其实力如何变化方面做得很好。根据ProCyclingStats(PCS)点数对团队进行排序,顶部为2020,底部为2021。节点之间的线代表各个骑手。线的宽度对应于每个骑手的PCS排名。该图是交互式的,您可以将鼠标悬停在流和节点上以查看更多详细信息。

找出在这个WorldTour转会赛季结束后,谁移动了位置以及哪些团队成功获得了更高的排名。

2020年大选区地图

**2020年大选区地图
**

《纽约时报》的《Upshot》刊登了2020年大选的“极其详尽”的选区地图。它代表了42个州中1,922个县(共3,143个)的县级投票结果,并随着新数据的到来而不断更新。

除了2020年的结果之外,该地图还允许您通过可视化投票保证金变动来调查2016年以来的变化。从这个角度来看,它极大地显示了郊区发生的事情。看看亚特兰大(如上图),菲尼克斯和匹兹堡,这是最明显的例子,其中蓝移趋势非常明显。

探索有关美国如何投票的详细信息。如果您想查看更多的选举地图,请不要错过我们的特别版,《20多个可视化2020年美国总统选举结果的选举地图》。

随着时间的推移,美国参议院中年龄段的代表

**随着时间的推移,美国参议院的代议制
**

在查看2020年大选后美国参议院的变化时,我们不要错过一件与政党关系不大的重要事情。第一个千禧一代到了!来自佐治亚州的33岁的乔恩·奥索夫(Jon Ossoff)是有史以来第一位参议员。在wcd.fyi的这个简单但酷的可视化中,您可以看到他被表示为孤独的粉红色瓷砖。

图表可视化,美国参议院的一段时间,因为1947年基础上从ProPublica国会API数据的代击穿。一瓦就是一名参议员-将鼠标悬停在其上即可查看姓名,年龄等。

参见参议院的代际转变。在图表下方,您可以了解其构建方式以及查找备用表格视图的方法。

伦敦健康街道指数

**伦敦健康街道指数
**

_STREETS研究小组发布了一张互动地图,一目了然,显示了伦敦市中心每条街道的健康程度。可视化基于“健康街道指数”得分,该得分总结了十个城市环境和体验指标-空气质量,噪声水平,交通优势,停车和休息场所的可利用性,看和做的事情等等。综合考虑这些因素,可以确定一条街道的步行,骑行和消磨时间的状况。

使用红色(低)到黄色(中)到绿色(高)的传统调色板显示每条街道的“健康街道指数”分数。

该项目目前仅适用于伦敦市中心。但是作者已经在努力扩展它,首先覆盖整个英国,然后走向国际。一探究竟。

查看原文

赞 0 收藏 0 评论 0

杨柳依依 发布了文章 · 2月20日

如何在dhtmlxGantt网格中对任务进行排序和重新排序

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。它允许你创建动态甘特图,并以一个方便的图形化方式可视化项目进度。有了dhtmlxGantt,你可以显示活动之间的依赖关系,显示具有完成百分比阴影的当前任务状态以及组织活动到树结构。

重新排序任务

dhtmlxGantt提供了两种在网格中对任务进行重新排序的方法:

  1. 拖放
  2. 排序

这些方法是替代的。默认情况下,两种模式都是禁用的。

要启用拖放重排序,请使用order_branch选项:

gantt.config.order_branch = true;
gantt.init("gantt_here");

您可以看一下视频指南,该指南显示了如何在网格中对任务进行排序和重新排序。

在整个甘特结构中拖放

该order_branch选项允许同一树级别中拖动任务。

也可以启用可以在整个甘特图中重新排序任务的模式。这意味着一个任务可以替换任何树级别的另一个任务。要使用这种类型的任务重新排序,请使用order_branch_free选项:

// reordering tasks within the whole gantt
gantt.config.order_branch = true;
gantt.config.order_branch_free = true;

gantt.init("gantt_here");

拒绝掉到特定位置

要拒绝将任务放到特定位置,请使用onBeforeTaskMove或onBeforeRowDragEnd事件:

//prevent moving to another sub-branch:
gantt.attachEvent("onBeforeTaskMove", function(id, parent, tindex){

var task = gantt.getTask(id);
if(task.parent != parent)
    return false;
return true;

});

//or
gantt.attachEvent("onBeforeRowDragEnd", function(id, parent, tindex){

var task = gantt.getTask(id);
if(task.parent != parent)
    return false;
return true;

});

改善大型数据集的性能

如果您的甘特图中包含很多任务,则分支重排序的默认模式可能会降低性能。为了加快速度,您可以使用“标记”模式。

gantt.config.order_branch = "marker";

在此模式下,仅将任务名称重新排序(按住鼠标左键),并且仅当将任务放在目标位置时(释放键)才重新渲染甘特图。与默认模式不同,更改任务位置不涉及触发onBeforeTaskMove / onAfterTaskMove事件。

为防止任务掉落到特定位置,请改用onBeforeRowDragMove事件(仅在“标记”模式下有效)。

拖放时突出显示可用放置位置

要在拖动过程中突出显示可用的目标位置(例如,不可能将根节点拖动到另一个根目录下,并且您想在视觉上通知用户此信息),请使用onRowDragStart和onRowDragEnd事件:

gantt.config.order_branch = true;// order tasks only inside a branch
gantt.init("gantt_here");
gantt.parse(demo_tasks);

var drag_id = null;
gantt.attachEvent("onRowDragStart", function(id, target, e) {

drag_id = id;
return true;

});
gantt.attachEvent("onRowDragEnd", function(id, target) {

drag_id = null;
gantt.render();

});

gantt.templates.grid_row_class = function(start, end, task){

if(drag_id && task.id != drag_id){
    if(task.$level != gantt.getTask(drag_id).$level)
        return "cant-drop";
    }
return "";

};

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 0 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2月20日
个人主页被 199 人浏览