sqlserver2005的KPI展示控件开发详解

注意:这篇文章其实在几天前我已经写过,但是那是我的第一片文章,写的相当粗糙,很多东西都没有写详细,只是草草的提供了源码的下载,看到我的那篇<数据挖掘控件研究>点击量有点大,给了我不少安慰,因此决定重写KPI展示这片文章。没有深入了解过的朋友请继续往下看。

关于sqlserver2005中的KPI特性,相信接触过sqlserver2005的BI的平台的朋友都有所耳闻。并且跟数据挖掘查看器一样,微软只在sqlserver2005客户端里面提供了展示界面,并没有把展示的编程接口提供给我们。所以这些工作只有我们coder自己来做了。

开发详解-php server参数详解">
sqlserver2005里的KPI,创建的时候需要设置KPI名称,值表达式,目标表达式,状态指示器,状态表达式,走向指示器,走向表达式等。后来通过google得知,原来sqlserver2005自带的那个KPI的查看器,实现原理是这样的。微软先做了n张图片,图片的路径在(注意:我的sqlserver2005是安装在D盘的)

D:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\DataWarehouseDesigner\KPIsBrowserPage\Images

然后,通过状态表达式和走向表达式返回不同的值来决定显示哪张图片。

原理还是非常简单,还好它没有采用GDI把这些图片画出来,呵呵,不然小弟只有罢手了。接下来,我们开始coding吧。

step1.定义一个DataGridViewStatusCell(从DataGridViewImageCell继承)和DataGridViewStatusColumn(从DataGridViewImageColumn继承),用于显示状态指示器。

Code

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.Reflection;
namespace KPIDisplayer
{
internal class DataGridViewStatusCell : DataGridViewImageCell
{
public DataGridViewStatusCell()
{
}
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
{
string statusgraph = value.ToString().Split(',')[0];
double status = Double.Parse(value.ToString().Split(',')[1]);
if (statusgraph == StatusGraph.Shapes)
{
if (status == -1)
{
return Properties.Resources.Stoplight_Single0;
}
else if (status == 0)
{
return Properties.Resources.Stoplight_Single1;
}
else if (status == 1)
{
return Properties.Resources.Stoplight_Single2;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.TrafficLight)
{
if (status == -1)
{
return Properties.Resources.Stoplight_Multiple0;
}
else if (status == 0)
{
return Properties.Resources.Stoplight_Multiple1;
}
else if (status == 1)
{
return Properties.Resources.Stoplight_Multiple2;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.RoadSigns)
{
if (status == -1)
{
return Properties.Resources.Road0;
}
else if (status == 0)
{
return Properties.Resources.Road1;
}
else if (status == 1)
{
return Properties.Resources.Road2;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.GaugeAscending)
{
if (status == -1)
{
return Properties.Resources.Gauge_Asc0;
}
else if (status == -0.5)
{
return Properties.Resources.Gauge_Asc1;
}
else if (status == 0)
{
return Properties.Resources.Gauge_Asc2;
}
else if (status ==0.5)
{
return Properties.Resources.Gauge_Asc3;
}
else if (status == 1)
{
return Properties.Resources.Gauge_Asc4;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.GaugeDescending)
{
if (status == -1)
{
return Properties.Resources.Gauge_Desc0;
}
else if (status == -0.5)
{
return Properties.Resources.Gauge_Desc1;
}
else if (status == 0)
{
return Properties.Resources.Gauge_Desc2;
}
else if (status == 0.5)
{
return Properties.Resources.Gauge_Desc3;
}
else if (status == 1)
{
return Properties.Resources.Gauge_Desc4;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.Thermometer)
{
if (status == -1)
{
return Properties.Resources.Therm0;
}
else if (status == 0)
{
return Properties.Resources.Therm1;
}
else if (status == 1)
{
return Properties.Resources.Therm2;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.Cylinder)
{
if (status == -1)
{
return Properties.Resources.Cylinder0;
}
else if (status == 0)
{
return Properties.Resources.Cylinder1;
}
else if (status == 1)
{
return Properties.Resources.Cylinder2;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.SmileyFace)
{
if (status == -1)
{
return Properties.Resources.Smiley0;
}
else if (status == 0)
{
return Properties.Resources.Smiley1;
}
else if (status == 1)
{
return Properties.Resources.Smiley2;
}
else
{
return Properties.Resources.empty;
}
}
else if (statusgraph == StatusGraph.VarianceArrow)
{
if (status == -1)
{
return Properties.Resources.Arrow_Beveled0;
}
else if (status == -0.5)
{
return Properties.Resources.Arrow_Beveled1;
}
else if (status == 0)
{
return Properties.Resources.Arrow_Beveled2;
}
else if (status == 0.5)
{
return Properties.Resources.Arrow_Beveled3;
}
else if (status == 1)
{
return Properties.Resources.Arrow_Beveled4;
}
else
{
return Properties.Resources.empty;
}
}
else
{
return Properties.Resources.empty;
}
}
}
}

时间: 2024-08-02 10:05:51

sqlserver2005的KPI展示控件开发详解的相关文章

日历控件开发详解0

从今天开始,我们将一步步学习如何实现一个Android的日历控件,今天是第一天! 一.准备工作之配置参数 制作一个日历控件,我们首先要配置一些参数 1.尺寸 dimension.xml <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 日历边框间距 --> <dimen name="margin">10dp</dimen> &

日历控件开发详解1

在前一篇日志中我们已经做好了日历控件的准备工作,今天我们将继续完成这个日历控件. 三.日历元素之Border 在Border类中,我们主要完成日历边框的绘制 package com.xys.mycalender.element; import android.app.Activity; import android.graphics.Canvas; import android.view.View; import com.xys.mycalender.R; import com.xys.myca

Android仿京东淘宝自动无限循环轮播控件思路详解

在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于RelativeLayout,首先要考虑的就是自定义的控件需要扩展那些属性,把这些属性列出来.在这里是要实现类似于京东淘宝的无限轮播广告栏,那么首先想到的就是轮播的时长.轮播指示器的样式等等.我在这里列举了一些并且结合到了代码中. 1.扩展属性 (1)是否开启自动轮播的功能. (2)指示器的图形样式,一

android之SeekBar控件用法详解_Android

MainActivity.java package com.example.mars_2400_seekbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import a

android之RatingBar控件用法详解_Android

MainActivity.java package com.example.mars_2500_ratingbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import

WebBrowser控件使用详解

原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的"后退"按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的"前进"按钮,使你在当前历史列表中前进一项 GoHome 相当于IE的"主页"按钮,连接用户默认的主页 GoSearch 相当于IE的"搜索"按钮,连接用户默认的搜索页面 Navigate 连接到指定的URL Refresh 刷新当前页面 Refresh2 同上,只是可以指定

Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解_Android

一.淘宝商品详情页效果 我们的效果 二.实现思路      使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="h

android之SeekBar控件用法详解

MainActivity.java package com.example.mars_2400_seekbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import a

android之RatingBar控件用法详解

MainActivity.java package com.example.mars_2500_ratingbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import