2023年2月

在很多软件界面中,一个好的界面、方便的导航除了为软件增色不少外,也提高了用户体验,促进软件的良性发展,因为我们的软件一般需要有菜单、工具条、状态条等这些基本的东西,但是工具条本身应该是一些常用的快捷键,内容不能放置太多,否则会容易给客户凌乱的感觉。菜单条则可以分类,但是好像每次去点击,一步步深入,则显得比较麻烦。本篇我介绍一下一个很好的导航条OutlookBar控件。

在我的2个版本的送水软件中,都用到了OutLookBar的工具条,使用的界面效果如下所示。

左边的工具条它们都是同一个控件来的,控件提供了一种类似Outlook方式的工具条,用来切换各种业务窗口,用上这个控件,肯定为您的程序增色不少。这个控件结合上面介绍的布局控件"WeifenLuo.WinFormsUI.Docking"(具体见文章
WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
),那么效果会更好。下面介绍下如何在代码中使用这个Outlookbar工具控件。

1、首先创建一个窗体,用来放置该控件,由于该控件不是一个可视化的控件,因此需要做一些特别的处理,如添加一个ImageList控件,并把OutlookBar控件中用到的图标加载进来,记得选择一些好看的图片哦。

2、在MainToolWindow窗体的构造函数或者Load事件中添加OutlookBar的初始化代码和设置代码,如下所示。


private
OutlookBar outlookBar1
=

null
;


public
MainToolWindow()
{
InitializeComponent();

InitializeOutlookbar();
}


private

void
InitializeOutlookbar()
{
outlookBar1

=

new
OutlookBar();


#region
销售管理

OutlookBarBand outlookShortcutsBand

=

new
OutlookBarBand(
"
销售管理
"
);
outlookShortcutsBand.SmallImageList

=

this
.imageList;
outlookShortcutsBand.LargeImageList

=

this
.imageList;
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
订单管理
"
,
0
));
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
客户管理
"
,
1
));
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
水票管理
"
,
2
));
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
套餐管理
"
,
3
));
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
今日盘点
"
,
5
));
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
来电记录
"
,
6
));
outlookShortcutsBand.Items.Add(

new
OutlookBarItem(
"
送货记录
"
,
7
));
outlookShortcutsBand.Background

=
SystemColors.AppWorkspace;
outlookShortcutsBand.TextColor

=
Color.White;
outlookBar1.Bands.Add(outlookShortcutsBand);


#endregion



#region
产品库存管理

OutlookBarBand mystorageBand

=

new
OutlookBarBand(
"
产品库存管理
"
);
mystorageBand.SmallImageList

=

this
.imageList;
mystorageBand.LargeImageList

=

this
.imageList;
mystorageBand.Items.Add(

new
OutlookBarItem(
"
产品管理
"
,
2
));
mystorageBand.Items.Add(

new
OutlookBarItem(
"
库存管理
"
,
3
));
mystorageBand.Background

=
SystemColors.AppWorkspace;
mystorageBand.TextColor

=
Color.White;
outlookBar1.Bands.Add(mystorageBand);

#endregion











.

outlookBar1.Dock

=
DockStyle.Fill;
outlookBar1.SetCurrentBand(

0
);
outlookBar1.ItemClicked

+=

new
OutlookBarItemClickedHandler(OnOutlookBarItemClicked);
outlookBar1.ItemDropped

+=

new
OutlookBarItemDroppedHandler(OnOutlookBarItemDropped);


//
outlookBar1.FlatArrowButtons = true;



this
.panel1.Controls.AddRange(
new
Control[] { outlookBar1 });
}


private

void
OnOutlookBarItemClicked(OutlookBarBand band, OutlookBarItem item)
{

switch
(item.Text)
{

#region
销售管理



case

"
订单管理
"
:
Portal.gc.MainDialog.ShowContent(

"
订单管理
"
,
typeof
(FrmOrder));

break
;

case

"
客户管理
"
:
Portal.gc.MainDialog.ShowContent(

"
客户管理
"
,
typeof
(FrmCustomer));

break
;

case

"
水票管理
"
:
Portal.gc.MainDialog.ShowContent(

"
水票管理
"
,
typeof
(FrmTicketHistory));

break
;

case

"
套餐管理
"
:
FrmYouhui dlg

=

new
FrmYouhui();
dlg.ShowDialog();

break
;

case

"
来电记录
"
:
Portal.gc.MainDialog.ShowContent(

"
来电记录
"
,
typeof
(FrmComingCall));

break
;

case

"
送货记录
"
:
Portal.gc.MainDialog.ShowContent(

"
送货记录
"
,
typeof
(FrmDeliving));

break
;


#endregion



#region
产品库存管理


case

"
产品管理
"
:
Portal.gc.MainDialog.ShowContent(

"
产品管理
"
,
typeof
(FrmProduct));

break
;

case

"
库存管理
"
:
Portal.gc.MainDialog.ShowContent(

"
库存管理
"
,
typeof
(FrmStock));

break
;

#endregion













..


default
:

break
;
}
}


private

void
OnOutlookBarItemDropped(OutlookBarBand band, OutlookBarItem item)
{

//
string message = "Item : " + item.Text + " was dropped

";

//
MessageBox.Show(message);


}

在代码中注意绑定相关项目的图标序号,否则如果序号不正确,可能会出错的,其实整个控件就是提供展示一些图标,并用同一的事件对鼠标的事件进行处理,用户根据OutlookBarItem的文本内容来判断处理,虽然模式有点落后,不过个人感觉控件还是非常好用,方便。

最后呈上相关的控件文件:
https://files.cnblogs.com/wuhuacong/UtilityLibrary.rar

我们知道,Microsoft patterns & practices小组开发的Enterprise Library是一款非常好的组件,其有很多个模块,包括数据访问、配置、加密、IOC容器、日志、异常处理等内容,其中数据访问模块是其中非常不错的一个数据访问组件,提供了对各种数据库操作的抽象封装,使用数据访问起来基本上是对各种数据库是透明的,最重要的是,简化了代码,提高了开发效率。
本文介绍Enterprise Library中的数据访问模块在操作Oracle过程中的一些经验总结,作为自己和博友做数据库访问的一个参考。
1、存储过程的游标处理
这个和SqlServer数据获取有点不同,在Oracle中用存储过程返回数据内容,必须定义一个游标,如下面所示的Oracle存储过程



Code


大家看到,上面的SelectAll和SelectBy存储过程都需要一个游标的参数,是OUT类型的,也就是你获取数据需要定义一个输出的游标参数,我们看看普通的数据访问是如何做的。



Code


上面是不用Enterprise Library数据访问而直接使用ADO.NET的数据对象访问的数据库,可以看到存在两个问题,一个是数据操作的代码比较臃肿,如果你使用很多这种操作,就会发现很多重复性的代码,另外就是数据解析的部分也比较臃肿重复,我们下面看看使用了Enterprise Library数据访问模块后的效果是如何。



Code


是不是代码很简短了,这里注意两个地方,一个是我们创建游标的时候,采用cur_OUT来做为它的名称,这样我们就不用增加整个游标的定义了,因为EnterpriseLibrary模块默认给我们增加了这个游标处理(有可以少3行代码了)。另外引入了SmartDataReader对象来处理数据的转换问题,这个类后面附上,以供参考。
由于EnterpriseLibrary 默认的数据访问游标是cur_OUT,如果存储过程的游标名称和cur_OUT不一样,如p_Cur,那么数据库操作代码会变化为下面,这个必须注意。否则你的数据访问总是获取不到而发生错误。



Code


下面附上数据解析类的代码,供参考。
https://files.cnblogs.com/wuhuacong/SmartDataReader.rar

做了很久的代码生成工具,基本上都是基于表生成实体类属性的,把数据库表的信息拿出来,然后之乎者也后生成一个标准的实体类,包含字段、属性、描述等东西。
是基于整个数据库生成整个框架代码的工具,如我的代码生成工具Database2Sharp(下载地址
http://www.iqidi.com/Download/Database2SharpSetup.rar
),基本上能满足前期的框架代码生成。
不过后来在做一些非数据库的项目的实体类,还有一些不是基于表一一对应关系的实体类,写这些字段属性的代码就显得比较乏味,杀鸡用小刀可能比较好,于是花了点功夫,做了一个小工具,主要用来在开发中随意生成一些实体类的场合,现在免费提供出来,希望对大家有一点点用处。
软件的界面如下所示


软件很小(小刀随身携带,用得到的地方帮助很大的),界面也只有一个,程序已经默认了一些配置,在上面输入一些字段名称等内容就可生成实体类了,生成后拷贝到你的代码中应用就可以了。
下面都是可以接受的输入内容,快速生成属性代码

name

int
age

double
tall
//
身高


string
city
//
所属城市


private
DateTime birthday;
//
出身年月


string
[] friends;


希望对大家有用,程序文件的地址是:
https://files.cnblogs.com/wuhuacong/PropertyGenerator.rar

原来的SharpCode是我为EnterpriseLibrary1.0即(2005版本)进行快速开发的的代码生成工具, 适用于Oracle, SqlServer, Access等数据库的代码生成。这款软件耗费了我不少心血,也是我开发共享软件的磨练作品,曾经也有很多客户跟随着我使用。
随着时间的变化,EnterpriseLibrary不断的版本升级,从1.0到目前的4.1,经历了不少变化,EnterpriseLibrary从2.0开始,编程模型就基本上稳定下来了,而我由于致力于开发新一代的代码生成工具Database2Sharp,基于NVelocity模版生成的整套代码框架的代码生成工具,基本上抛弃了ShapCode的那种在代码中硬编码模版的方式,因此SharpCode也就一直没有做更新,因为有了更好更强大的产品。Database2Sharp功能上基本上覆盖到了,而且比SharpCode的功能更多,灵活性更好了。
前阵子在开发Oracle应用的时候,发现SharpCode还是在处理快速的3层(在此指界面层,数据访问层、数据库)还是很方便,而且速度很快(因为SharpCode表数据是即需加载的,Database2Sharp是开始全部加载的),因为我需要很简单的存储过程,数据管理类,实体类的这些东西,不需要很大的一个工程模版,因此SharpCode的特点就显现出来了。
因此在原来的基础上,把代码部分修改为支持最新的EnterpriseLibrary开发模型,并去掉注册部分的内容,免费发布给大家使用,当做我旧代码生成工具的一个回馈社会吧,新的代码生成工具Database2Sharp还将继续收取部分费用,以维持开发的热情和付出。
下面截取几个SharpCode的界面截图出来看看,后面附送上文件下载地址。

自动生成的代码内容如下所示


存储过程的界面截图,支持Oracle和SqlServer,Oracle下使用更方便。


SharpCode代码生成工具下载地址:
http://www.iqidi.com/download/sharpcode.rar

本文部分说明内容摘自网络文章,经过本人在MapXtreme2008中编写相关的演示例子,详细说明如何操作MapXtreme2008提供的矢量符号和定制符号。
MapXtreme 在其安装过程中自动安装 10 种 MapInfo 特定的 TrueType 字体。这些字体为用户提供了字形符号选择,范围涉及天气、房地产、交通等。字形编号为 Unicode 字符值,由于这些编号位于第一个 Unicode 字符代码块范围内,因此,与 ASCII 字符集兼容。
MapXtreme包含三种点样式:BitmapPointStyle (
位图点样式
)、FontPointStyle(
字体点样式
)和SimpleVectorPointStyle(
简单矢量点样式
)。

简单矢量点样式


此样式包含使用MapInfo 3.0 兼容专有字体用于绘制点的样式属性(MapInfow.fnt)。SimpleVectorPointStyle 属性包括了要为点绘制的实际符号的颜色、点大小和形状码。标准集包括符号31 至67。以下是符号与形状码的对应图,31是空。在比较简单的场合使用此样式已经足够,但是很多场合都不简单。



结构:


public
SimpleVectorPointStyle(

short
code,

Color color,

double
pointSize

);

code
上面图片中对应的形状码
color
填充符号的颜色,上面图片中为黑色
pointSize
符号大小

字体点样式

使用FontPointStyle 类可以显示TrueType字体集,允许的最大点大小为240 点。这给了我们很大的自由空间,其中的MapInfo Symbols字体和上面的字体是相同的,不过MapInfo Symbols是TrueType字符集。MapXtreme自带的字体:
Map Symbols
MapInfo Arrows
MapInfo Cartographic
MapInfo Miscellaneous
MapInfo Oil&Gas
MapInfo Real Estate
MapInfo Shields
MapInfo Symbols
MapInfo Transportation
MapInfo Weather

可以使用一些相关软件查看这些字体的具体内容,比如 字体试衣间 、微软自带的 字符映射表 。


public
FontPointStyle(

short
code,

Font font,

short
angle,

Color color,

double
pointSize

);

code
字体映射的编码
font
字体的样式。很关键,字体样式的强大全靠它了
angle
字体旋转的角度
color
字体填充的颜色
pointSize
字体的大小,12就差不多了

位图点样式


定制的位图符号位于 C:\Program Files\Common Files\MapInfo\MapXtreme\6.x\CustSymb。每个图像的文件扩展名都是 .BMP。可以用编程方式通过 MapInfo.Styles 命名空间中的 BitmapPointStyleRepository 集合类访问这些符号。可以创建自己的位图图像并将其添加到 CustSymb 目录。尽管事实上对创建的图像没有大小限制,不过 MapXtreme 显示图像的能力取决于可用的内存。图像不一定必须是方形,而且还可以具有最多24 位颜色深度。要确保图像以其高度和宽度显示,则必须在各自图像的 BitmapPointStyle 对象中将Boolean "NativeSize" 属性设置为 true。
位图点样式应该是最可能被用到的样式。它通过自定义的图片来标识地图上的图元。位图点样式具有ShowWhiteBackground 属性;如果设置为false,则位图中的白像素为透明。默认情况下,ShowWhiteBackground 被设置为false。


public
BitmapPointStyle(

string
strName,

BitmapStyles style,

Color color,

double
pointSize

);

strName
图片的相对路径加上名称。一般图片的根路径是  X:\Program Files\Common Files\MapInfo\MapXtreme\6.x\CustSymb    X为安装盘。同时图片也放在那里。
style
图片的样式。

  • None: 按默认的状态显示。并且白色部分将透明。
  • ShowWhiteBackground: 显示白色部分。
  • ApplyColor: 在标识中的透明部分将用第三个参数的颜色填充.
  • NativeSize: 按标识的真实大小和象素显示,第四项参数将无效.

color
白色部分的填充色

pointSize
标识大小

下面分别介绍这几种图标如何在Web中添加展示,下面列出相关代码。



Code


其他部分的相关代码如下:



Code


以上得到的界面效果如下图所示,分别有3个对应的图标与之对应。