WinForms版本OLAP快速入门 > 代码中配置字段 |
交互性是Olap应用的一个主要优势。用户应该能够很方便的创建和修改视图,并且迅速看到结果。C1Olap通过它的仿Excel用户界面,用户友好且简单的对话框很好的实现了这一点。
但是在某些情况下,你业务想要使用代码配置视图。C1Olap通过强大的对象模型,特别是Field类和Filter类来实现这一点。
下面的例子介绍了用户如何通过C1Olap创建和配置视图。
首先创建一个新的WinForms应用,然后添加一个C1OlapPage 控件到表单中。切换到代码视图,使用下述代码加载数据,然后将其赋值到C1OlapPage 控件。
public Form1()
{
InitializeComponent();
// get data
var da = new OleDbDataAdapter("select * from invoices",
GetConnectionString());
var dt = new DataTable();
da.Fill(dt);
// bind to olap page
this.c1OlapPage1.DataSource = dt;
// build initial view
var olap = this.c1OlapPage1.OlapEngine;
olap.ValueFields.Add("ExtendedPrice");
olap.RowFields.Add("ProductName", "OrderDate");
}
static string GetConnectionString()
{
string path = Environment.GetFolderPath(
Environment.SpecialFolder.Personal) +
@"\ComponentOne Samples\Common";
string conn = @"provider=microsoft.jet.oledb.4.0;data source={0}\c1nwind.mdb;";
return string.Format(conn, path);
}
代码从NorthWind数据库(由C1Olap安装)中加载了”Invoices”视图,将数据绑定到C1OlapPage控件,然后生成一个初始化视图用于显示根据产品和订单日期统计的”ExtendedPrice”字段的总和。这和上一个示例基本类似。
如果你现在运行示例,你将看到一个包含所有的产品和日期的Olap视图。
接下来,让我们用C1Olap对象模型来改变订单日期和总价的显示格式:
public Form1()
{
InitializeComponent();
// get data
// no change…
// bind to olap page
// no change…
// build initial view
// no change…
// format order date
var field = olap.Fields["OrderDate"];
field.Format = "yyyy";
// format extended price and change the Subtotal type
// to show the average extended price (instead of sum)
field = olap.Fields["ExtendedPrice"];
field.Format = "c";
field.Subtotal = C1.Olap.Subtotal.Average;
}
代码将从包含数据源中所有指定字段的Fields集合中检索个别字段。然后将它希望的值赋给Format 和Subtotal属性。Format是常规的.NET字符串,Subtotal决定数值如何聚集显示在Olap视图中。缺省情况下,数值将完成添加,同时其他的聚合统计功能同样可用。这些功能包括求平均值,最大值,最小值,标准偏差以及方差。
现在你可能仅对数据中的子集感兴趣,其中描述了一部分产品和一个年份的数据。用户可以右键单击字段,然后对它们应用过滤器。你同样可以通过代码实现这一功能:
public Form1()
{
InitializeComponent();
// get data
// no changes…
// bind to olap page
// no changes…
// build view
// no changes…
// format order date and extended price
// no changes…
// apply value filter to show only a few products
C1.Olap.C1OlapFilter filter = olap.Fields["ProductName"].Filter;
filter.Clear();
filter.ShowValues = "Chai,Chang,Geitost,Ikura".Split(',');
// apply condition filter to show only some dates
filter = olap.Fields["OrderDate"].Filter;
filter.Clear();
filter.Condition1.Operator =
C1.Olap.ConditionOperator.GreaterThanOrEqualTo;
filter.Condition1.Parameter = new DateTime(1996, 1, 1);
filter.Condition2.Operator =
C1.Olap.ConditionOperator.LessThanOrEqualTo;
filter.Condition2.Parameter = new DateTime(1996, 12, 31);
filter.AndConditions = true;
}
代码首先检索关联了”ProductName”字段的C1OlapFilter对象。然后,它清除过滤器,并设置ShowValues属性。这个数据包含一个应该在过滤器中显示的数值数组。在C1Olap中,我们称其为一个”value filter”。
接下来,代码检索关联”OrderDate”字段的过滤器。这一次,我们想要展示指定年份的数值。但是我们并不想列举一整年的每一天。取而代之的是,我们使用一个条件过滤器,通过两个条件来定义它。
第一个条件指定”OrderDate”的数值应该大于等于1996年1月1日。第二个条件用于指定”OrderDate”数值应该小于等于1996年12月31日。AndConditions属性指定第一以及第二条件如何应用(AND还是OR)。在本例中,我们希望日期同时满足这两个条件,所以AndConditions设置为True。
如果你再次运行项目,你看到的效果应该如下图所示: