DevExpress学习
一、安装、破解、汉化
1、安装
安装:我只用Reporting和WinForms Controls,所以我只选择这两个模块D:\net\soft\DevExpress2017\DevExpressUniversalTrialComplete-20180124.exe
破解:D:\net\soft\DevExpress2017\Cracks\Crack 2\DevExpress.Patch.exe
说明:数据包中的三个crack文件夹代表三种破解方法,请自行选择
破解查看:vs2017 --> DevExpress --> Your License Information 打开会看到你有一个期限,2037-01-31
-- 5642天 select to_date('2037-01-31','yyyy-mm-dd') - to_date('2021-08-21','yyyy-mm-dd') from dual; 5、D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class
2、特点
优势:美化界面、控件定制简单、专业化、替代所有的传统控制,换肤、菜单
3、汉化
a、单个项目汉化:
- 在Debug 下添加 zh-CN 汉化包:将汉化包改名字为zh-CN,放到bin/debug下面;
- 入口main函数加载如下代码;
b、统一汉化
将汉化包放到安装目录D:\Program Files (x86)\DevExpress 17.2\Components\Bin\Framework下
打开vs 2017 的开发人员命令提示符,输入命令:cd D:\Program Files (x86)\DevExpress 17.2\Components\Bin\Framework\zh-CN
继续输入命令 dir /B *.dll>temp.bat
以文本方式打开temp.bat文件编辑,在每一个DevExpress前加上gacutil -i
然后在命令行窗口执行temp.bat
这样做的好处是应用什么控件会自动给你加载对应的汉化;
temp.bat部分代码
gacutil -i DevExpress.Charts.Designer.v17.2.resources.dll gacutil -i DevExpress.Dashboard.v17.2.Core.resources.dll gacutil -i DevExpress.Dashboard.v17.2.Web.resources.dll gacutil -i DevExpress.Dashboard.v17.2.Win.resources.dll gacutil -i DevExpress.Data.v17.2.resources.dll ...
4、命名规则
| 组件类型 | 缩写 | 例子 |
|---|---|---|
| Label | lbl | lblNote |
| TextBox | txt | txtName |
| Button | btn | btnOk |
| ImageButton | ib | ibOk |
| LinkButton | lb | lbJump |
| HyperLink | hl | hlJump |
| DropDownList | ddl | ddlList |
| CheckBox | cb | cbChoice |
| CheckBoxList | cbl | cblGroup |
| RadioButton | rb | rbChoice |
| RadioButtonList | rbl | rblGroup |
| Image | img | imgBeauty |
| Panel | pnl | pnlTree |
| TreeView | tv | tvUnit |
| WebComTable | wct | wctBasic |
| ImageDateTimeInput | dti | dtiStart |
| ComboBox | cb | cbList |
| MyImageButton | mib | mibOk |
| WebComm.TreeView | tv | tvUnit |
| PagBar | pb | pbMaster |
二、基本控件
LabelControl
- 描述性标签
- AutoSizeMode:设置为None,可以随意拉大与缩小控件大小;设置为Horizontal(水平的);设置为Vertical(垂直的),可以水平拉长;
- BackColor:设置背景色;设置为Transparent,可以透明到父级;前提条件如下:
- 设置LookAndFeel下的style为Flat或UtralFlat
- 设置UserLookAndFeel属性为false
- ForeColor:设置前景颜色(字体颜色);
- Text:设置文本内容;
- Font:设置字体、字形、大小;
- BorderStyle:设置边框样式;
- Appearance(外观):
- BackColor、BackColor2设置渐变色;
- GradientMode设置渐变色的方向,可以水平渐变(Horizontal)、垂直渐变(Vertical)、左上到右下(ForwardDiagonal)、右上到左下(BackwardDiagonal)
- Image:设置图片;ImageAlignToText当有图片(image)时,图片相对于文本的位置,比如LeftCenter,则是图片在文字的左侧居中位置;
- ImageAlign:背景图片的对齐方式;
- TextOptions:HAlignment设置为Center,可以让
文本居中,前提是AutoSizeMode=none;- AppearanceDisabled:不可用状态下的外观,设计模式下无法看到,只有在运行时才可以看到;
- AppearanceHovered:鼠标经过时的外观;
- AppearancePressed:按下时的外观;
- LineColor:线的颜色
- LineLocation:线的位置;
- LineStyle:线的样式;
- LineOrientation:线的方向;
- LineVisible:线是否显示;
- LookAndFeel:设置外观,一般把UseDefaultLookAndFeel设置为true,适用缺省的皮肤;
- Font:字体的设置
- AutoEllipsis:当文本框长度不够的时候,可以显示省略号;
- WordWrap:是否自动折行;默认为NoWrap;当设置为默认或NoWrap时,AutoEllipsis才起效;
- 如果想让一个文字透明显示,
- 设置背景色为Transparent
- 因为背景色是相对于父级透明,所以必须设置父级;
LblTitle.Parent = LblParent;
XtraForm
DevExpress.XtraEditors.XtraForm通过定义可以看出,它实际上派于Form,主要用于LookAndFeel(外观和感觉),换肤效果;
// XtraForm 定义部分 public class XtraForm : MouseWheelContainerForm, ISupportLookAndFeel, IDXControl, ICustomDrawNonClientArea, IGlassForm // MouseWheelContainerForm 定义部分 public abstract class MouseWheelContainerForm : Form, IMouseWheelContainerXtraForm 继承于Form,并且支持DevExpress中的 Winform的更换皮肤功能;
XtraForm中的LookAndFeel属性中的SkinName可以设置不同的皮肤,但是需要设置UserDefaultLookAndFeel为FALSE才好使;一个应用程序最好只有一个DefaultLookAndFeel
设置了LookAndFeel,其实并不会生效,需要在入口Main函数添加如下代码,才能生效
// 只有设置了这段代码,皮肤才会生效 SkinManager.EnableFormSkins(); // 设置默认皮肤 UserLookAndFeel.Default.SetSkinStyle("McSkin");WindowState:确定窗体的初始可视状态。
Normal:以Size属性设置的窗体大小进行显示;
Minimized:最小化显示;
Maximized:最大化显示;
MaximizeBox:窗体标题栏的右上角是否有最大化按钮。默认为True。
MiniMizeBox:窗体标题栏的右上角是否有最小化按钮。默认为True。
Icon:指示窗体的图标。这在窗体的系统菜单框中显示,以及当窗体最小化时显示。
ShowIcon:指示是否在窗体的标题栏中显示图标。默认为true
FormBorderStyle:指示窗体的边框和标题栏的外观和行为。
- None:无边框;
FixedSingle:固定的单行边框;
- Fixed3D:固定的三维边框;
FixedDialog:固定的对话框样式的粗边框;
- Sizeable:可调整大小的边框;
FixedToolWindow:不可调整大小的工具窗口边框。工具窗口不会显示在任务栏中也不会显 示在当用户按 Alt+Tab 时出现的窗口中。尽管指定 FixedToolWindow的窗体通常不显示在任务栏中,还是必须确保 ShowInTaskbar 属性设置为 false,因为其默认值为 true;
SizableToolWindow:可调整大小的工具窗口边框。工具窗口不会显示在任务栏中也不会显 示在当用户按 Alt+Tab 时出现的窗口中。
FormBorderEffect:默认不带阴影效果,可以选择shadow,可以让底边和右边带上阴影效果;
Opacity:可以选择它的透明度;单位:百分比
IsMdiContainer:是否是Mdi窗口;
StartPosition:设置窗口打开的起始位置;
TopMost:指示该窗体是否始终显示在此属性未设置为true的所有其它窗体之上。
ShowInTaskbar:窗体是否出现在任务栏中。默认为True。否则最小化之后找不到;
AcceptButton:默认回车触发的按钮;
CancelButton:默认Esc触发的按钮
SimpleButton
主要用于执行命令的,比如打开页面、提交信息、查询数据等;
ShowFocusRectangle:是否按钮上显示文字的边框,一般设置为false
Enabled:设置为false,不允许点击;
Visible:设置为false,不可见;
TooTip:小提示,只有可用状态下;
ImageOptions:可以设置图片、图片相对于文字的位置;
SvgImage:一般建议设置这个矢量图;
Text:按钮的文本,可以适用超链接标签,但是必须设置AllowHtmlDraw为true;
LookAndFeel的style:如果不想适用皮肤的话,可以把这个属性设置为非skin即可
TextEdit
单行文本框;
public class TextEdit : BaseEdit, IDXMenuSupport, IMouseWheelSupport public class BaseEdit : BaseControl, IProcessInplaceEditValueChanged public abstract class BaseControl : ControlBase, IDXFocusController, IToolTipControlClient, ISupportLookAndFeel, ISupportStyleController, IXtraResizableControl, ISupportXtraAnimation, ISupportToolTipsForm public class ControlBase : Control基本控件分为两大类:BaseEdit和BaseStyleControl,都继承与BaseControl,它继承于ControlBase,它继承于Control
BaseStyleControl:可设置自身特有的样式,如ButtonStyle、HighlightedItemStyle等;
BaseEdit:可以通过EditValue属性获取当前控件的值,Properties属性获取控件特有的属性;
// Text 是一个字符串,而EditValue接收的参数是一个对象; string name = TxtUserName.Text.Trim(); // EditValue 会造成空指针异常 string name1 = TxtUserName.EditValue.ToString().Trim();LabelControl:支持格式化文本、图像、多行文本字符串和Html标签,外观(不可用、悬停、按下、默认)、图片与文本相应位置、标签线、是否文本省略等;
SimpleButton:可以显示文本和自定义图像,并在运行时单击而不接收焦点的按钮,普通按钮外观、回执Html格式标签、图标、图片、LookAndFeel;事件:单击、双击、鼠标单击、双击
TextEdit:单行文本编辑器,文本输入、密码输入、设置输入格式、外观、EditValue Mask、Format、 NullText等;事件:click、DoubleClick、EditValueChanged、KeyPress
PasswordChar:密码输入框,可以设置密码的文本用什么符号代替;
UserSystemPasswordChar:这个为true时,则适用系统默认的圆点作为密码输入框,自定义的无效;
Mask:掩码信息;MaskType:设置值类型
设置文本输入框只能输入整数和小数 【MaskType=RegEx】【EditMak=\d+(\R.\d{0,2})?】
Properties下的DisplayFormat和EditFormat的区别;显示格式化和编辑时的格式化;这个时候有可能Text和EditValue的值可能就不等;
当文本输入框组件绑定数据源时,直接給Text, EditValue属性赋值是无效的,因为没有写入数据到数据源。
解决方案1:赋值后,使用WriteValue方法。
//模拟给TextEdit赋值 private void button1_Click(object sender, EventArgs e) { //textEdit1.Text = "www.CSFramework.com"; textEdit1.EditValue = "www.CSFramework.com"; //使用此方法正常! //WriteValue:读取控件属性的当前值并将其写入数据源 textEdit1.DataBindings[0].WriteValue(); }NullText:水印提示,当输入完成再删除后是不显示的;
ShowNullValuePromptWhenFocused:显示空值得提醒;设为true
NullTextPrompt:null时的提醒;
NullValuePromptShowForEmptyValue:空值时提醒;设为true
ContextImageOptions:文本框前面设置图片;
TxtUserName.Properties.ContextImageOptions.Image = global::StudentManager.Properties.Resources._1;CharacterCasing:Upper(大写),Lower(小写)、Normal(标准)
BorderStyle:Style3D(边框效果)
还可以设置获取焦点是的外观、只读时的外观、不可用时的外观
常用事件:EditValueChanged EditValueChanging TextChanged
ButtonEdit
带按钮的文本框:本质还是一个文本框;支持编辑框的内置按钮的文本编辑器,派生于TextEdit;
public class ButtonEdit : TextEdit两种方式, 进入EditorButton集合编辑器:设置文本框右侧的按钮
- 在属性中Properties下的Buttons项;
- 窗体上点击ButtonEdit右上方的小箭头,弹出菜单中选择Buttons,也是一样的
ButtonEdit的文本框右侧的按钮可以有多个,在EditorButton集合编辑器中都可以进行设置。
在文本框右侧的按钮,全是DevExpress.XtraEditors.Controls.EditorButton类型的。
点击按钮的事件,可以在ButtonClick事件中指定
Click事件这里的参数e为DevExpress.XtraEditors.Controls.*ButtonPressedEventArgs*类型,可以在事件中根据*Caption、Kind*等属性判断当前鼠标点击的是哪个Button,再执行相应的逻辑。
private void BtneTop_ButtonClick(object sender, ButtonPressedEventArgs e) { if (e.Button.Kind == ButtonPredefines.OK) { MessageBox.Show("Ok"); } else if (e.Button.Kind == ButtonPredefines.Glyph) { if (e.Button.Caption == "Add") MessageBox.Show("Add"); else if (e.Button.Caption == "open") { OpenFileDialog dlg = new OpenFileDialog(); dlg.Multiselect = false;//允许同时选择多个文件 if (dlg.ShowDialog()==DialogResult.OK) { BtneTop.Text = dlg.FileName; } } } }注意: Caption和*Kind选项*
在每个按钮的*Kind属性*中,可以设置按钮的类型。按钮类型保存在枚举DevExpress.XtraEditors.Controls.ButtonPredefines中;该枚举包括如下枚举值(共计19个):
- Close,一个x型图案
- Delete,一个x型图案,线条比Close要细一些
- SpinRight,右三角形箭头
- SpinLeft,左三角形箭头
- SpinDown,下三角形箭头
- SpinUp,上三角形箭头
- Combo,同SpinDown
- Right,同SpinRight
- Left,同SpinLeft
- Up,同SpinUp
- Down,同SpinDown
- DropDown,同SpinDown
- Glyph(字形,图像字符),图案可由Image属性指定其中,当Kind被设置为Glyph时,可以通过设置Image属性来指定图案,当kind都为该项时,在事件中可以用Caption来区别;
- Ellipsis,省略号,三个点,默认图案
- OK,一个√型图案
- Plus,一个+型图案
- Minus,一个-型图案
- Redo,撤销图案,一个顺时针转动最后指向右侧的箭头
- Undo,重做图案,一个逆时针转动最后指向右侧的箭头;
PictureEdit
图片显示控件
而ImageEdit 是在下拉窗口中显示图像
BackColor 设置为Transparent 可以使图片背景透明 前提条件 你的图片是背景透明的PNG或者Gif
borderStyle 设为NoBorder 可以使图片无边框
SizeMode 图片显示的格式 选择Zoom 则为比例缩放显示
NullText 无图片或者无法显示时展示的文字
ReadOnly 是否只读
showMenu 是否显示右键菜单栏目
代码设置图片:
pictureEdit1.Image=Image.FromFile(path); path为图片硬盘上的绝对路径pictureEdit2.Image = Image.FromFile(Environment.CurrentDirectory + ".\\image\\wx2022.png");
CheckEdit
扮演两个角色 RadioButton和CheckBox
Name属性:该属性是设置控件的名称,chk为前缀,后面标注控件的名称。中间尽量不要用下划线。
Checked属性:这个属性是表明控件的状态是否是被选中,,如果是的话,则这个控件的Value为True;
Enabled属性:这个属性是设置控件是否可以被操作,如果是,这说明该控件是被编辑,否则不能被编辑。
支持用户在未选中、选中和(可选)不确定状态之间选择,可以将多个组和到一个RadioGroup中
Properties.CheckStyle属性:该属性是设置控件的一种格式,默认为Standard属性,也可以设置为其他的属性。切换图标样式,比如设置为radio样式
DisplayFormat属性:这个属性是设置控件的一种格式,可以是Custom,也可以是Datetime,具体哪种可以根据情况来定。
Properties.AllowGrayed属性设置CheckBox是否允许中间状态
Properties.RadioGroupIndex,让多个选项之间互斥,比如都设置为1就是互斥的;
// 设置图标样式 checkEdit2.Properties.CheckStyle = DevExpress.XtraEditors.Controls.CheckStyles.Radio;
CheckButton
- 选中和未选中的两种状态按钮
- 属性:Checked、GroupIndex、ImageOptions
- 在黑色皮肤下效果明显
- showFocusRectangle设置为false,不显示边框
ToggleButton
- isOn :是否开
- offText:关闭时文本
- onText:打开时文本
- ValueOff:关闭时EditValue值(若默认不修改状态还是false)
- ValueOn:打开时EditValue值(若默认不修改状态还是true)
- showText:是否显示文本
- GlyphAlignment:文本水平显示位置,far显示在最前面
- GlyphVerticalAlignment:文本垂直显示位置
MemoEdit
多行文本框
MaxLength:设置最大长度,设置为0,不限制
Lines:录入的数据,返回值是string[] ,每行是数组的一个元素,以换行符为主,自动换行的不算一行;
EditValue:所有文本内容
Text:所有文本内容
AcceptsReturn:是否可以输入回车
AcceptsTab:是否可以输入tab
characterCasing:是否转换大小写
NullValuePrompt:没有输入内容时的水印效果
ScrollBars:滚动条,WordWrap为true时,水平滚动条无效
WordWrap:是否允许自动换行,默认true
设置光标在最后
memoEdit1.SelectionStart = memoEdit1.Text.Length;
memoEdit1.ScrollToCaret();
SpinEdit
- 数字控件
- SpinEdit → BaseSpinEdit → PopopBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control
- IsFloatValue:是否允许小数
- Increment:步长
- MaxValue:最大值
- MinValue:最小值
- Value:获取值时不建议用EditValue,建议用这个,有类型decimal
- SpinButtonIndex:设置spin的位置索引,0,在前,1在后
- Buttons:SpinButton必须要有一个位置,所以Button设置时必须多一个才可以显示,可以通过ButtonClick事件来触发,参考ButtonEdit,因为他是ButtonEdit的子类
- TextEditStyle:设置为DisableTextEditor,只允许上下选择,不允许编辑
DateEdit
日期编辑器
DateEdit → PopopBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control
DateTime:获取或设置时间值
CalendaView设置为TouchUI,可以显示不一样的时间选择器,设置成Classic,才能显示今天按钮
ColumnCount:横向显示几个月,若设置成3,则会显示当前月、下月、下下月
RowCount:竖向显示几个月
FirstDayOfWeek:设置每周的第一天
ShowWeekNumers:是否显示第几周
Properties.AppearanceCalendar.DayCellSelected:可以设置选中后日期的颜色
AllowClickInactiveDays :设置为True,则只能选择当月的,不能显示临近灰色部分
设置常用格式
// 设置系统日期 dateEdit1.DateTime = DateTime.Now; // 设置显示的日期格式 dateEdit1.Properties.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm:ss"; dateEdit1.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime; // 设置编辑时的日期格式 dateEdit1.Properties.EditFormat.FormatString = "yyyy-MM-dd HH:mm:ss"; dateEdit1.Properties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime; dateEdit1.Properties.Mask.EditMask = "yyyy-MM-dd HH:mm:ss"; // 不允许清空 dateEdit1.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.False; // 如果要显示时间需要设置VistaDisplayMode=true, VistaEditTime=true。 // 意思为显示时间,在时间控件中会出现时钟图标,并可以编辑时间 dateEdit1.Properties.VistaDisplayMode = DevExpress.Utils.DefaultBoolean.True; dateEdit1.Properties.VistaEditTime = DevExpress.Utils.DefaultBoolean.True; // 设置显示的时间格式 dateEdit1.Properties.VistaTimeProperties.DisplayFormat.FormatString = "HH:mm"; dateEdit1.Properties.VistaTimeProperties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime; dateEdit1.Properties.VistaTimeProperties.EditFormat.FormatString = "HH:mm"; // 设置编辑时的时间格式 dateEdit1.Properties.VistaTimeProperties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime; dateEdit1.Properties.VistaTimeProperties.Mask.EditMask = "HH:mm"; // 设置可选择日期的范围 dateEdit1.Properties.MinValue = DateTime.Now.AddDays(-30); dateEdit1.Properties.MaxValue = DateTime.Now.AddDays(30); // 单选的日期范围 DateTime start = calendarControl1.SelectedRanges.Start; // 选中日期的0点 DateTime end = calendarControl1.SelectedRanges.End; // 选中日期24点 // 设置系统日期 dateEdit1.DateTime = DateTime.Now; dateEdit1.Properties.DisplayFormat.FormatString = "yyyy-MM"; dateEdit1.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime; dateEdit1.Properties.EditMask = "yyyy-MM"; dateEdit1.Properties.EditFormat.FormatString = "yyyy-MM"; dateEdit1.Properties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime; dateEdit1.Properties.Mask.EditMask = "yyyy-MM"; // 日期的显示样式,YearView只显示一年内的月 dateEdit1.Properties.VistaCalendarViewStyle = VistaCalendarViewStyle.YearView; dateEdit1.Properties.VistaCalendarViewStyle = VistaCalendarViewStyle.YearView;
TimeEdit
- 时间编辑器,和SpinEdit是兄弟
- TimeEdit → BaseSpinEdit → PopopBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control
- Time:设置和获取时间
- TextEditStyle:可以设置是否允许编辑
- TimeEditStyle:设置为TouchUI,可以显示不一样的时间选择器
- TouchUIMinuteIncrement:分钟增加数,比如设置成10,只显示10,20,30...
- TouchUIMaxValue:最大值
- TouchUIMinValue:最小值
- TouchUISecondIncerement:秒增加数,比如设置成10,只显示10,20,30...
FontEdit
- 使用下拉框显示字体
- FontEdit → ComboxEdit →
PopupBaseAutoSearchEdit→ PopupBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control- EditValue:获取和设置属性
- SelectedItem:
ColorEdit
- 使用下拉框选择颜色
- ColorEdit → PopopBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control
- Color:获取和设置属性
- ColorDialogType:在自定义最下面两行空白的栏位右键可以打开颜色选择器;默认是高级的,若这里选择simple,则会出现一个简约风格的颜色选择框
- CustomeColor:空余十六个栏位,就是自定义颜色下面自带的空白栏位;
- ColorAlignment:设置颜色的值和颜色相对的位置,选择Near就是常用的;
- ShowXXX:设置一些显示的属性,比如不显示网络颜色,可以将ShowWebColors设置为false
CalcEdit
- 使用下拉框计算数据
- CalcEdit → PopopBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control
- EditValue:获取值
CalendarControl
显示月历并允许用户选择日期或者日期范围
设置和日期组件相似
CalendarTimeEditing:设为true,可以修改日期
ShowXXX:可以修改显示的一些属性,如想显示今天和清除按钮,则必须CalendaView设置为Classic,在CalendaView的不同模式下会有不同的效果;
DrawCellLines:设置是否显示网格线
SelectionMode:设置成Multiple,按住shift可以多选
// 单选的日期范围 DateTime start = calendarControl1.SelectedRanges.Start; // 选中日期的0点 DateTime end = calendarControl1.SelectedRanges.End; // 选中日期第24点 // 多选的日期范围 DateTime start = calendarControl1.SelectedRanges.Start; // 选中第一个日期的0点 DateTime end = calendarControl1.SelectedRanges.End; // 选中第二个日期的24点
CheckedListBoxControl
CheckedListBoxControl:数据显示控件,该控件以列表框的形式显示复选列表;
里面可以存放很多的CheckedListBoxItem
// 初始化一个选择框控件 private void InitCheckedListBox() { CheckedListBoxItem[] cklbs = { new CheckedListBoxItem("1", "篮球", CheckState.Checked), new CheckedListBoxItem("2", "足球", CheckState.Unchecked), new CheckedListBoxItem("3", "乒乓球", CheckState.Unchecked), new CheckedListBoxItem("4", "羽毛球", CheckState.Unchecked), new CheckedListBoxItem("5", "橄榄球", CheckState.Unchecked) }; cklbControl.Items.AddRange(cklbs); // 选中即点击,否则需要点两次 cklbControl.CheckOnClick = true; // 根据高度先排列,后根据宽度横向排列,显示不选的显示横向滚动条 cklbControl.MultiColumn = true; }// 1、 给checkedListBoxControl绑定数据源: checkedListBoxControl.DataSource = listRole; checkedListBoxControl.DisplayMember = "roleName"; checkedListBoxControl.ValueMember = "ID"; // 2、打钩checkedListBoxControl控件里的某一项: checkedListBoxControlRole.SetItemChecked(i, true); //i是控件的索引值 // 3、获取checkedListBoxControl控件里某一项的ValueMember值 checkedListBoxControlRole.GetItemValue(i).ToString();//i是控件的索引值 // 4、实现checkedListBoxControl控件点击一次就可以选中复选框,设置CheckOnClick属性为true,即可。 // 5、获取所有的选中项 var items = checkedListBoxControl1.CheckedItems;
ComboxEdit
类继承图:DevExpress.XtraEditors.ComboBoxEdit
- ComboxEdit →
PopupBaseAutoSearchEdit→ PopupBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → Control常见属性
EditValue
Text
Items
SelectedItem
SelectedIndex
SelectedText
if (cbeClass.SelectedIndex >= 0) { Msg.Show("Text:"+cbeClass.Text + Environment.NewLine+ "SelectSelectedText:" + cbeClass.SelectedText + Environment.NewLine + "SelectedItem:" + cbeClass.SelectedItem + Environment.NewLine + "SelectedIndex:" + cbeClass.SelectedIndex + Environment.NewLine + "EditValue" + cbeClass.EditValue); }数据绑定方式
comboBoxEdit1.Properties.Items.Add(object item)string sql = "select class_name from bill_item_class_dict"; DataTable dt = OracleHelper.GetDataBySql(sql); // 清除所有项 cbeClass.Properties.Items.Clear(); if (dt.Rows.Count > 0) { foreach (DataRow row in dt.Rows) { cbeClass.Properties.Items.Add(row[0]); } // 默认选择第一项 cbeClass.SelectedIndex = 0; }常用事件SelectedIndexChanged
绑定键值对
// 1、定义一个实体类 public class ComboxList { public string Text { get; set; } public string Value { get; set; } // 必须重写该方法,否则下拉框内显示类名 public override string ToString() { return Text; } } // 2、绑定数据 string sql = "select class_name value,CLASS_CODE key from bill_item_class_dict"; DataTable dt = OracleHelper.GetDataBySql(sql); // 清除所有项 cbeClass.Properties.Items.Clear(); if (dt.Rows.Count > 0) { foreach (DataRow row in dt.Rows) { ComboxList cbList= new ComboxList() { Text = row[0].ToString(), Value = row[1].ToString() }; cbeClass.Properties.Items.Add(cbList); } // 默认选择第一项 cbeClass.SelectedIndex = 0; } // 3、获取数据 ComboxList comboxList = cbeClass.SelectedItem as ComboxList; Msg.Show(comboxList.Text+":" + comboxList.Value);
CheckedComboxEdit
可以在下拉复选框中选中多个项,选后,点击确定或收缩下拉框,选择的值显示在编辑框中,以分隔符分隔
类继承图:DevExpress.XtraEditors.CheckedComboBoxEdit
- CheckedComboBoxEdit →
PopupContainerEdit→ PopupBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → ControlText 、 AllowMultiSelect 、
DataSource、DisplayMember、ValueMember、SelectAllItemCaption、 SeparatorChar、 ShowButtons如果绑定数据是string,不用指定
DisplayMember、ValueMember如果设置绑定,添加项无效
// 数据绑定 checkedComboBoxEdit1.Properties.DisplayMember = "VALUE"; // 西药 checkedComboBoxEdit1.Properties.ValueMember = "KEY"; // A checkedComboBoxEdit1.Properties.DataSource = dt; //是否显示 确定、取消按钮 , 但是还会有一个小x号 checkedComboBoxEdit1.Properties.ShowButtons = false; //是否显示 取消按钮 不会有小x号 checkedComboBoxEdit1.Properties.ShowPopupCloseButton = false; // 将(选择所有) 修改为:全选 checkedComboBoxEdit1.Properties.SelectAllItemCaption = "全选"; // 将多选项的分隔符号修改为 | checkedComboBoxEdit1.Properties.SeparatorChar = '|'; // 修改此项可以设置为是否允许用户编辑DisableTextEditor(不允许,默认),Standard(允许编辑) checkedComboBoxEdit1.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard; // 当修改为list ,EditValue 返回的是个List,但不影响Text 属性 checkedComboBoxEdit1.Properties.EditValueType = DevExpress.XtraEditors.Repository.EditValueTypeCollection.List; // 数据获取 checkedComboBoxEdit1.EditValue.ToString(); // A checkedComboBoxEdit1.Text; // 西药
LookUpEdit
类图:DevExpress.XtraEditors.LookUpEdit
- LookUpEdit→
LookUpEditBase→PopupBaseAutoSearchEdit→ PopupBaseEdit → ButtonEdit → TextEdit → BaseEdit → BaseControl → ControlBase → ControlText、EditValue、
DataSource、DisplayMember、ValueMember、ImmediatePopup、AutoSearchColumnIndex、SearchMode获取值
string id = this.lookUpEdit1.EditValue.ToString(); //是lookUpEdit.Properties.ValueMember的值 string name = this.lookUpEdit1.Text.Trim(); //是lookUpEdit.Properties.DisplayMember的值SearchMode:
OnlyInPopup:配合ImmediatePopup=true使用,并根据输入的字符从头部开始匹配AutoSearchColumnIndex属性指定栏位字段的值,默认为第一栏位0
AutoComplete,配合ImmediatePopup=true使用,并在输入框自动完成你想要输入的数据,同时下拉窗体自动匹配最佳记录,这个值匹配DisplayMember对应的字段。
特点:能在输入框显示匹配的数据,并且下拉窗体显示匹配的记录AutoFiler : 配合ImmediatePopup=true使用,并在输入框自动完成你想要输入的数据,同时下拉窗体自动过滤不匹配的记录。这个值匹配DisplayMember对应的字段。
特点:能过滤掉不想要的数据,自动过滤掉不匹配的数据// lookUpEdit1 lookUpEdit1.Properties.DisplayMember = "CLASS_NAME"; // 可以不指定,但是影响Text lookUpEdit1.Properties.ValueMember = "CLASS_CODE"; // 可以不指定,但是影响 EditValue lookUpEdit1.Properties.DataSource = dt; // 修改此项可以设置为是否允许用户编辑DisableTextEditor(不允许,默认), // Standard(允许编辑) ,但是必须是下拉框内数据,否则清空编辑器 lookUpEdit1.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;
RepositoryItemLookUpEdit
下拉框
public class ComboxList { public string ItemCode { get; set; } public string ItemName { get; set; } public ComboxList(string itemCode, string itemName) { ItemCode = itemCode; ItemName = itemName; } } BindingList<ComboxList> blSummaryType = new BindingList<ComboxList>() { new ComboxList("0","Sum"), new ComboxList("1","Min"), new ComboxList("2","Max"), new ComboxList("3","Count"), new ComboxList("4","Average"), new ComboxList("5","Custom"), new ComboxList("6","None") }; RepositoryItemLookUpEdit riluSummaryType = new RepositoryItemLookUpEdit() { DataSource = blSummaryType, DisplayMember = "ItemName", ValueMember = "ItemCode", NullText = "" }; riluSummaryType.Columns.AddRange(new DevExpress.XtraEditors.Controls.LookUpColumnInfo[] { new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ItemCode","代码",30), new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ItemName","名称",70), }); gridView2.Columns["SummaryType"].ColumnEdit = riluSummaryType;
RepositoryItemGridLookUpEdit
和RepositoryItemLookUpEdit不同之处在于他具有Grid的属性,可以多列,可以点击表头的小漏斗过滤数据
使用方法
RepositoryItemGridLookUpEdit riluFormatType = new RepositoryItemGridLookUpEdit() { DataSource = blFormatType, DisplayMember = "ItemName", ValueMember = "ItemCode", NullText = "" }; GridColumn riglupgcId = riluFormatType.View.Columns.AddField("ItemCode"); riglupgcId.Caption = "编号"; riglupgcId.VisibleIndex = 0; riglupgcId.Width = 30; GridColumn riglupgcName = riluFormatType.View.Columns.AddField("ItemName"); riglupgcName.Caption = "名称"; riglupgcName.VisibleIndex = 1; riglupgcName.Width = 70; riluFormatType.View.Columns.Add(riglupgcId); riluFormatType.View.Columns.Add(riglupgcName); gridView2.Columns["FormatType"].ColumnEdit = riluFormatType;
ListBoxControl
DataSource---------数据源
DisplayMember-----默认显示成员
这两个属性是listBoxControl和checkedListBoxControl绑定数据必须要设置的数据,如果不设置,绑定的是对象的话,需要重写ToString方法
SelectionMode-----选择方式(单选/多选)这个属性listBoxControl比较常用,checkedListBoxControl一般不用设置
SelectedItem------选中项
SelectedValue-----选中值
这两个方法都是用于获取单一选中项的,放回的都是DataRowView类型的对象,如果多选,一般返回第一个对象
DataRowView的Row属性可以返回一个DataRow类型的对象
SelectedItems-----多个选中项
Items:当控件未绑定到数据源时,提供对项集合的访问。 也就是说指定DataSource时访问该属性无效;因为在绑定模式下,控件的控件的BaseCheckedListBoxControl.Items集合为空,不能用于访问单个列表框项。要获取列表框项目,请使用BaseListBoxControl.GetItem方法。
ItemCount :获取列表框控件的集合中包含的元素数。
RadioGroup
- Properties -- Items:显示的内容
- RadioGroup默认项竖排修改为横排显示:Properties -- Columns :修改columns的值即可,实现横排显示
- 获取值:radioGroup1.Properties.Items[radioGroup1.SelectedIndex].Value.ToString();
- 默认选中项:SelectedIndex属性修改为-1,则默认不选中任一项,修改为0则默认选中第一项,以此类推。
三、高级控件
LayoutContol
LayoutControl是一个项目容器,将这些项目安排在一行或一列中。
LayoutControl是DevExpress的布局管理器库的主要组成部分。它允许您在表单中排列任何控件,而不会重叠或者未对齐。自动生成一个 LayoutControlGroup,可以调整
layoutControlGroup2.Padding = new DevExpress.XtraLayout.Utils.Padding(5)来设置距离四边的偏移量当您将控件拖放到LayoutControl上时,添加的控件会自动被包装到LayoutControlItem中,LayoutControl直接利用它来进行布局。向LayoutControl中添加控件时,默认会转换成LayoutControlItem,每个LayoutControlItem会包含一个标签和控件本身。相当于LayoutControl给添加的空间增加了一个标签组合成一个新的控件。
可以统一设置控件中文字到控件的间距。
layoutControl1.OptionsItemText.TextToControlDistance = 50;,统一设置控件和文字之间的间距模式:
layoutControl.OptionsItemText.TextAlignMode = DevExpress.XtraLayout.TextAlignMode.AutoSize;可以设置这个属性为true,显示边框线:
layoutControlGroup2.GroupBordersVisible = true;LayoutControl
- AllowCustomization:设置为false,这样运行中就不会有右键菜单了;
- AutoScroll:控件超出容器后不显示滚动条
LayoutControlGroup:
- Text:设置文本,同时设置TextVisible=true,GroupBordersVisible=true将会显示组标签
- 折叠:当出现组标签时,可以通过设置以前属性来配合折叠效果
- ExpanButtonMode:Normal向上箭头,Inverted:向下箭头
- ExpandButtonVisible:是否显示折叠按钮
- Expanded:默认状态是否允许展开
- ExpandOnDoubleClick:设为true,可以双击组标签任意位置进行折叠
- TextLocation:设置组标签的位置
- AllowBorderColorBlending:设置为true时,可以通过AppearanceGroup的BorderColor设置边框颜色,包括组标签的背景色
- LayoutMode:
- 设置为Regular
- 设置为Table。设置layoutgroup的OptionsTableLayoutGroup这个属性里的行和列设置一下就可以控制行数和列数,以及每行和每列的大小。
- 可以通过LayoutControlItem的OptionTableLayoutItem设置该item的位置以及占几行几列。ColumnIndex:从第几列开始,RowIndex:从第几行开始,ColumnSpan:占几列,RowSpan占几列
LayoutControlItem:
- Text:设置标签颜色,
- TextAlignMode:标签对齐方式,
- TextLocation:相对于控件的位置;
- TextVisible:设置是否显示文本
- TextToControlDistance:文字离控件的距离;
- Spacing:设置左右上下空间,和padding设置一个即可
- ImageOption下的Image:可以设置图片,ImageToTextDistance指定图片离文本的距离
通过语句创建
// 创建一个LayoutControl面板 LayoutControl lc = new LayoutControl { // 布局整个页面 Dock = DockStyle.Fill }; // 将LayoutControl面板加入到控件中 this.Controls.Add(lc); // 创建一个子项 LayoutControlItem item1 = lc.Root.AddItem(); // 创建一个文本编辑器 TextEdit textEdit = new TextEdit(); textEdit.Name = "txtName"; item1.Name = "LayoutItem1"; item1.Text = "姓名"; item1.Control = textEdit; item1.Padding = new DevExpress.XtraLayout.Utils.Padding(10); // 创建一个子项 LayoutControlItem item2 = new LayoutControlItem { // 设置子项的父亲 Parent = lc.Root, Name = "LayoutItem2" }; Control textBox2 = new TextEdit(); textBox2.Name = "txtEmail"; item2.Control = textBox2; item2.Text = "电子邮件"; item2.Padding = new DevExpress.XtraLayout.Utils.Padding(10); // Create a layout item. LayoutControlItem item3 = new LayoutControlItem { Name = "LayoutItem3", Parent = lc.Root }; Control textBox3 = new MemoEdit { Name = "TextBox3" }; item3.Control = textBox3; item3.Text = "我的简介"; item3.Padding = new DevExpress.XtraLayout.Utils.Padding(10);操作步骤
向窗体中添加LayoutControl控件
(1)添加GroupBox控件名为groupControl1,拖入后如图3所示,控件默认填充整个GroupControl,而且在界面中或者groupControl1的属性中是无法直接修改大小的。
(2)隐藏控件的layoutControlItem(Text)。在向LayoutControl中添加控件后,会默认在其左侧添加一个layoutControlItem,隐藏该部分的方法是右键layoutControlItem,点击【Hide Text】,隐藏后如图4所示。如想重新显示需要设置layoutControlItem → TextVisible → true
修改groupControl1的尺寸。
右键layoutControlGroup1(鼠标必须在该控件上右键),在弹出的菜单中点击【CustomizeLayout】→【Layout Tree View】→【layoutControlItem1】,如图5,6所示。
(注意:在添加多个控件后会对应多个layoutControlItem(代表序号,1,2,3...),修改某一个控件时,必须找到其对应的layoutControlItem*进行属性的修改)
BarManager
BarManager是一个菜单栏管理类,主要是在C#桌面应用中显示菜单栏的作用;
创建一个BarManager后,会默认创建一个Bar
this.barManager1 = new DevExpress.XtraBars.BarManager(this.components); this.menubar = new DevExpress.XtraBars.Bar();去掉最右侧的箭头
this.bar1.OptionsBar.AllowQuickCustomization = false;去掉最左边的竖线
this.bar1.OptionsBar.DrawDragBorder = false;取消右键菜单
this.barManager1.AllowShowToolbarsPopup = false;隐藏和显示菜单
if (this.barLargeButtonItem1.Visibility == DevExpress.XtraBars.BarItemVisibility.OnlyInCustomizing) { this.barLargeButtonItem3.Caption = "隐藏"; this.barLargeButtonItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; } else { this.barLargeButtonItem3.Caption = "显示"; this.barLargeButtonItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.OnlyInCustomizing; }如何使toolbar显示图标
方法之一是:放一个imagelist,里面放一些图在toolbar里建立一个barbuttonitem,然后选中这个item,在属性里为其imageindex分配一个imagelist里的图如何使statusbar里的各项可以自定义宽度
使用statictext,把autosize改为none,然后即可调整width如何使item项目前加一个竖线
选中item右键,启用组
XtraReports
XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示,因此,每个报表都作为
带区的容器使用,而每个带区中都包含报表控件。XtraReports 中的每个报表都可以被绑定到数据,或者不绑定。要创建绑定报表,则首先要把报表绑定到数据源,然后指定每个报表控件的数据绑定选项。
报表控件、带区 和报表自身的所有大小和位置,都以报表内相同的单位度量。 度量单位由报表的
XtraReport.ReportUnit属性指定,可以设置为下列类型之一:百分之一英寸:当 ReportUnit 属性值被设置为 ReportUnit.HundredthsOfAnInch 时使用。 十分之一毫米:当 ReportUnit 属性值被设置为 ReportUnit.TenthsOfAMillimeter 时使用。页面构建时用到的事件
Before Print:
在 预览/打印/导出 报表期间,在 XRControl 对象创建其图像之前,XRControl.BeforePrint 事件发生,主要用于以程序方式改变报表的属性、带区的属性、以及存放在 DetailBand 细节带区中的控件的属性。在此事件中可以执行大部分任务 (例如改变 XRControl.Visible、XRControl.BackColor、XRControl.BorderColor 以及其他属性),可以被轻松执行,而 无需编写代码,只是使用 格式设置规则。 此外,BeforePrint 事件可以被接管,从而重新指派控件的样式,并且调整其 XRControl.LocationF 属性。
可以使用
XtraReportBase.GetCurrentColumnValue方法为数据绑定控件获取数据列的当前值。private void xrLabel1_BeforePrint(object sender, PrintEventArgs e) { if (Convert.ToDouble(this.GetCurrentColumnValue("UnitPrice")) > 30) { XRControl control = this.FindControl("xrLabel1", true); control.LocationF = new PointF(15F, 15F); control.Styles.Style = this.StyleSheet[0]; } }报表结构
整个报表是由多个绑定带区组成,绑定带区如下:
绑定带区 说明 TopMarginBand 每个页面上面都显示的空白(天头),在PageHeaderBand或者ReportHeaderBand上面 ReportHeaderBand 在报表起始位置(报表头), 此带区被设计用于显示某些概述信息,例如报表的封面。 PageHeaderBand 在每个页面的上方(页眉),在TopMarginBand或者ReportHeaderBand下方 GroupHeaderBand 在每组的起始位置,或者在分跨多个页时而位于组的上方(分组标头)。 此带区指定分组标准,并被用于显示每组记录起始位置的信息 DetailBand 在页面上所有其他带区之间(细节)。 此带区每行只显示绑定数据源中的一条记录,或者当没有为报表指定数据源时而简单地持有非绑定控件。 DetailReportBand 在DetailBand的下方(从表),被设计用于在创建主/从报表时持有从报表 GroupFooterBand 在每组的结束位置,或者在分跨多个页时而位于组的下方(分组脚注)。 此带区主要被设计用于显示每组的总结信息。 ReportFooterBand 在报表结束位置(报表脚注)。 此带区被设计用于显示某些终极信息,例如报表总结。 PageFooterBand 在每个页面的下方(页脚)在ReportFooterBand下方和BottomFooterBand上方,此带区被设计用于从之前页面接续的页码或表尾 BottomMarginBand 每个页面底部的空白(地脚),在PageFooterBand的下方。 报表常用属性
属性 说明 BackColor 设置报表控件的背景色 Bands 报表包含的带区,用于放置各种控件(集合) BorderColor 报表中控件边框颜色 BorderDashStyle 报表中控件边框样式 Borders 报表中控件边框 BorderWidth 边框宽度 CalculatedFiled 计算字段,主要被用于 data-aware(数据感知) 报表中(集合) DataAdapter 数据源Adapter对象 DataMember 数据源中用于绑定报表的具体表 DataSource 报表数据源 DataSourceSchema 指定数据源框架文件(XML/XSD文件) DesignerOptions ShowDesignerHints(bool):设计时显示提示ShowDesignerWarnings(bool):设计时显示警告提示ShowPrintingWarnings(bool):打印提示 DetailPrintCount 设置打印的页数 DetailPrintCountOnEmptyDataSource 当数据源为空时打印的次数 DrawGrid(bool) 设置是否要绘制对齐网格 ExportOptions 用于设置报表导出时的相关属性(集合) FilterString 报表数据过滤字符串 PageColor 报表页面颜色 FormattingRules 设置格式化样式 FormattingSheet 格式化样式集合 PagerKind 设置纸张类型 Parameters 设置报表参数 PrintOnEmptyDatasource(bool) 设置当数据源为空时是否打印 RequestParameters(bool) 设置是否在参数Submit后再创建报表 SnapGridSize 设置报表对齐网格大小 SnappingModel 设置对齐模式(SnapToLines&SnapToGrid) SnapToGrid(bool) 设置是否对齐到网格 StyleSheet 设置控件引用的样式 StyleSheetPath 设置引用外部样式文件 TextAlignment 设置报表字体对齐方式 Watermark (属性集合)用于设置报表的水印,包括图片和文字 XmlDataPath 设置数据源为Xml文件的数据源路径
创建一个XtraReport
在Form窗口中打开
XtraReportHelloWorld xtraReport = new XtraReportHelloWorld(); ReportPrintTool printTool = new ReportPrintTool(xtraReport); // 普通打开 printTool.ShowPreview(); // 对话框方式打开 printTool.ShowPreviewDialog(); // 指定外观样式打开 printTool.ShowPreview(UserLookAndFeel.Default);
SplitContainerControl
- SplitContainerControl实现界面分离,分为左右或者上下区域。
- 默认是分左右区域。如果想要分上下区域,则把splitContainerControl对象的属性:Horizontal设置成False.
GridControl
属性
- Dock :在容器中如何填充
- DataSource:设置数据源,如果定义列,列名对应的FiledName必须大写
- LookAndFeel:
事件
- RowCellClick:将GridView的OptionsColumn.AllowEdit设置为false后左键可触发RowCellClick。不管这一列OptionsColumn.AllowEdit是不是false,只要这一列有MouseDown事件,就不会执行该列的RowCellClick事件。
各种View
CardView
GridView
BandedGridView
AdvBandedGridView
advBandedGridView1.Columns["ENAME"].Caption = "员工编号"; advBandedGridView1.Columns["ENAME"].AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; advBandedGridView1.Columns["ENAME"].AppearanceCell.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center; advBandedGridView1.Columns["ENAME"].AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; advBandedGridView1.Columns["ENAME"].AppearanceHeader.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center; // 是否启用偶数行外观 advBandedGridView1.OptionsView.EnableAppearanceEvenRow = true; // 是否启用奇数行外观 advBandedGridView1.OptionsView.EnableAppearanceOddRow = true; // 设置Band所占的行数 this.gridBand1.RowCount = 1; // 字段自动宽度 advBandedGridView1.OptionsView.ColumnAutoWidth = true;LayoutView
WinExplorerView
TitleView
1、如何显示行号
2、设置行样式,如变色
RowCellStyle 行单元格样式事件, 用于设置行单元格样式
void GridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
{
// 单行变色,还是渐变色
if (e.Column.FieldName == "UserType")
{
string status = this.winGridViewPager1.gridView1.GetRowCellValue(e.RowHandle, "UserType").ToString();
if ("经理".Equals(status))
{
e.Appearance.BackColor = Color.Red;
e.Appearance.BackColor2 = Color.LightCyan;
e.Appearance.ForeColor = Color.White;
}
else if ("管理员".Equals(status))
{
e.Appearance.BackColor = Color.Yellow;
e.Appearance.BackColor2 = Color.LightCyan;
e.Appearance.ForeColor = Color.White;
}
}
}
void GridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
{
// 整行变色
if (e.RowHandle >= 0)//当前视图的所有行
{
Users user = (Users)winGridViewPager1.gridView1.GetRow(e.RowHandle);//获取所以行的数据
if (user == null) return;
if ("经理".Equals(user.UserType))
{
e.Appearance.BackColor = Color.YellowGreen;
}
}
}
private void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
{
// 隔行变色
if (e.RowHandle%2==0)
{
e.Appearance.BackColor = Color.BlanchedAlmond;
}
}
4、设置表头和表单
// 设置表头内容
advBandedGridView1.Columns["ENAME"].Caption = "员工编号";
// 设置表单内容 水平居中
advBandedGridView1.Columns["ENAME"].AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
// 设置表单内容 垂直居中
advBandedGridView1.Columns["ENAME"].AppearanceCell.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center;
// 设置表头内容 垂直居中
advBandedGridView1.Columns["ENAME"].AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
// 设置表头内容 垂直居中
advBandedGridView1.Columns["ENAME"].AppearanceHeader.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center;
// 是否启用偶数行外观
advBandedGridView1.OptionsView.EnableAppearanceEvenRow = true;
// 是否启用奇数行外观
advBandedGridView1.OptionsView.EnableAppearanceOddRow = true;
// 设置Band所占的行数
this.gridBand1.RowCount = 1;
// 字段自动宽度
advBandedGridView1.OptionsView.ColumnAutoWidth = true;
四、Excel导出
1、AsposeExcelTools
- 这个导出去的样式不好看,仅仅是数据
- 但是可以直接导出DataTable
private void barLargeButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", "医保类别"));
if (!string.IsNullOrEmpty(file))
{
try
{
string error = "";
AsposeExcelTools.DataTableToExcel2(dataSource.Tables[0], file, out error);
if (!string.IsNullOrEmpty(error))
{
Msg.ShowError(string.Format("导出Excel出现错误:{0}", error));
}
else
{
if (Msg.ShowConfirmYesNo("导出成功,是否打开文件?"))
{
System.Diagnostics.Process.Start(file);
}
}
}
catch (Exception ex)
{
Msg.ShowError(ex.Message);
}
}
}
2、GridControl.ExportToXls
- 这个导出去的样式好看,和GridControl看到的一样,并且带有过滤功能
- 这个需要GridControl控件
private void Exp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (this.gridView1.RowCount > 0)
{
SaveFileDialog fileDialog = new SaveFileDialog
{
Title = "导出Excel",
Filter = "Excel文件(*.xls)|*.xls"
};
DialogResult dialogResult = fileDialog.ShowDialog(this);
if (dialogResult == DialogResult.OK)
{
//DevExpress.XtraPrinting.XlsExportOptions options = new DevExpress.XtraPrinting.XlsExportOptions();
gridControl1.ExportToXls(fileDialog.FileName);
if (Msg.ShowConfirmYesNo("保存成功!文件位置:" + fileDialog.FileName + Environment.NewLine + "是否打开"))
{
System.Diagnostics.Process.Start(fileDialog.FileName);
}
}
}
else
{
Msg.Show("没有需要导出的数据" );
}
}
五、计划任务
1、Quartz.Net
Quartz.net:它是一个简单的执行任务计划的组件,基本包括这三部分:
- Job(做业):须要在任务计划中执行的具体逻辑操做
- Trigger(触发器):须要什么时间什么规则来去执行Job 做业
- scheduler(调度器):将Job 和 Trigger 注册到 scheduler 调度器中,主要负责协调Job、Trigger 的运行工具
在VS 中 工具 > NuGet 程序包管理器 > 程序包管理器 下载
Quartz.net开发步骤
1、继承作业接口IJob建立计划任务(有参)
/// <summary> /// 1、继承作业接口IJob建立计划任务(有参) /// </summary> public class FirstJob : IJob { public const string JobKey = "Address"; public Task Execute(IJobExecutionContext context) { return Task.Factory.StartNew(()=> { // JobDataMap 获取参数 JobDataMap data = context.JobDetail.JobDataMap; int jobAddress = data.GetIntValue(JobKey); // 获取窗口的运行实例 var instance = (Form1)Application.OpenForms["Form1"]; Debug.WriteLine($"{Thread.CurrentThread.Name} 设备{jobAddress},数据{instance.Count},时间{DateTime.Now}"); instance.Count++; }); } }2、通过调度器工厂创建默认的调度器Scheduler
3、通过JobBuilder生成一个任务job
4、通过TriggerBuilder建立一个触发器trigger
5、将job和trigger加入到调度器Scheduler中
private async void CreateJobWithParm(int address) { Debug.WriteLine($"创建【有参】任务,时间:{DateTime.Now}"); // 2、通过调度器工厂创建默认的调度器Scheduler IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); // 3、通过JobBuilder生成一个任务job IJobDetail job1 = JobBuilder.Create<FirstJob>().WithIdentity($"Address{address}","groupB").Build(); // 将参数加入到任务中 job1.JobDataMap.Put(FirstJob.JobKey, address); // 4、通过TriggerBuilder建立一个触发器trigger ITrigger trigger = TriggerBuilder.Create().WithIdentity($"Address{address}", "groupB").StartNow(). WithSimpleSchedule(x=>x.WithIntervalInSeconds(10) // 10秒执行一次 .WithRepeatCount(10)) // 执行10次 .Build(); // 5、将job和trigger加入到调度器Scheduler中 await scheduler.ScheduleJob(job1, trigger); }按钮中调用
private async void btnJob1_Click(object sender, EventArgs e) { IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); JobKey key = JobKey.Create($"Address1","Drip"); var exist = await scheduler.CheckExists(key); if (exist) { MessageBox.Show("当前已运行Job:1"); } else { CreateJobWithParm(1); } }额外知识:计算时间差
// 计算时间差的方法 // TotalDays 将TimeSpan结构所表示的时间间隔换算成等效天数。 // TotalHours 将TimeSpan结构所表示的时间间隔换算成等效小时数。 // TotalMinutes 将TimeSpan结构所表示的时间间隔换算成等效分钟数。 // TotalSeconds 将TimeSpan结构所表示的时间间隔换算成等效秒数数。 // TotalMilliseconds 将TimeSpan结构所表示的时间间隔换算成等效毫秒数。 private int DateDiff(DateTime DateTime1, DateTime DateTime2) { int dateDiff = 0; // Ticks : 表示多少个一百纳秒(计算机的一个计时单位)。 TimeSpan ts1 = new TimeSpan(DateTime1.Ticks); TimeSpan ts2 = new TimeSpan(DateTime2.Ticks); TimeSpan ts = ts1.Subtract(ts2).Duration(); // dateDiff = ts.Days.ToString()+"天"+ ts.Hours.ToString()+"小时"+ ts.Minutes.ToString()+"分钟"+ ts.Seconds.ToString()+"秒"; dateDiff = ts.Minutes; return dateDiff; }
六、其他知识点
1、获取当前运行的路径
Application.StartupPath : 获取当前应用程序所在目录的路径,最后不包含“\”;
Application.ExecutablePath : 获取当前应用程序文件的路径,包含文件的名称;
AppDomain.CurrentDomain.BaseDirectory : 获取当前应用程序所在目录的路径,最后包含“\”;
System.Threading.Thread.GetDomain().BaseDirectory : 获取当前应用程序所在目录的路径,最后包含“\”;
Environment.CurrentDirectory : 获取当前应用程序的路径,最后不包含“\”;
System.IO.Directory.GetCurrentDirectory:获取当前应用程序的路径,最后不包含“\”;
