本篇文章主要介绍Dev Express控件LookUpEdit、GridControl、RibbonControl工具栏等的使用。并记录了如何在GridControl中的GridView添加右键菜单,以及如何实现菜单选择事件。
1.LookUpEdit 实现下拉框
(1)绑定数据源:
DataSet ds = new DataSet();
DT_Project = new DataTable();//数据源
DT_Project.Columns.Add("project_id");
//添加一行数据库中不存在的数据
DataRow dr = DT_Project.NewRow();
dr["project_id"] = "请输入或选择...";
DT_Project.Rows.Add(dr);
ds.Tables.Add(DT_Project);
ds.Tables[0].Merge(BLL.Project.Project.Que_AllProjectId()); //与数据库中查询到的DataTable合并
this.lookupEdit_ProjectId.Properties.DataSource = DT_Project;
this.lookupEdit_ProjectId.Properties.ValueMember = "project_id";//一般ValueMember绑定Id,也是this.lookupEdit_ProjectId.EditValue的值
this.lookupEdit_ProjectId.Properties.DisplayMember = "project_id";//DisplayMember绑定Name,是下拉列表要显示的数据,也是this.lookupEdit_ProjectId.Text的值
this.lookupEdit_ProjectId.Properties.ShowHeader = false;
this.lookupEdit_ProjectId.Properties.ShowFooter = false;
this.lookupEdit_ProjectId.Properties.NullText = "无";//数据源无数据时,显示的文本
//要使用户可以输入,这里须设为Standard
this.lookupEdit_ProjectId.Properties.TextEditStyle = TextEditStyles.Standard;
//设定下拉列表的行数
this.lookupEdit_ProjectId.Properties.DropDownRows = DT_Project.Rows.Count;
//设定lookupEdit下拉列表宽度
this.lookupEdit_ProjectId.Properties.PopupFormMinSize = new System.Drawing.Size(10, 10);
this.lookupEdit_ProjectId.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("project_id", ""));//使得LookupEdit只显示Displayer
//this.lookupEdit_projectName.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("project_id", "下拉框列头Caption"));
this.lookupEdit_ProjectId.ItemIndex = 0;
(2)LookUpEdit 实现用户输入
//实现用户输入
this.lookupEdit_ProjectId.ProcessNewValue += LookUpEdit1_ProcessNewValue;//调用下面方法
/// <summary>
/// 实现用户自由输入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LookUpEdit1_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
{
DataRow Row;
RepositoryItemLookUpEdit Edit = ((LookUpEdit)sender).Properties;
if (e.DisplayValue == null || Edit.NullText.Equals(e.DisplayValue) || string.Empty.Equals(e.DisplayValue))
return;
Row = DT_Project.NewRow();
Row["project_id"] = e.DisplayValue;//用户输入的数据
DT_Project.Rows.Add(Row);
e.Handled = true;
}
2.GridControl
如下,GridControl中只有一个GridView
(1)添加列
(2)GridView初始化方法,如设置行号,隔行换色等,
写了一个 GridView的初始化方法,不用每个GridView的单独设置一遍,调用方式很简单,调用方法: this.gridView_IssuesList.InitGridView(); 该方法在load事件里调用就可以啦。
下面是具体实现:
public static void InitGridView(this GridView view)
{
try
{
view.GroupPanelText = "查询结果";
view.OptionsView.ShowGroupPanel = false; //隐藏最上面的GroupPanel:
//view.OptionsBehavior.Editable = false; //只读
view.OptionsBehavior.EditorShowMode = DevExpress.Utils.EditorShowMode.Click;//不可编辑
view.OptionsView.ShowColumnHeaders = true;//显示列头
view.OptionsView.ColumnAutoWidth = true;//显示水平滚动条,即各列的宽度自动调整
//view.OptionsCustomization.AllowColumnResizing = false;//禁止列头改变列宽
view.OptionsBehavior.AutoPopulateColumns = false;//禁止自动生成列
view.BestFitColumns();//列自动匹配宽度
//各行换色
view.Appearance.OddRow.BackColor = Color.White; // 设置奇数行颜色 // 默认也是白色 可以省略
view.OptionsView.EnableAppearanceOddRow = true; // 使能 和上面绑定 同时使用有效
view.Appearance.EvenRow.BackColor = Color.WhiteSmoke; // 设置偶数行颜色
view.OptionsView.EnableAppearanceEvenRow = true; // 使能 和上面绑定
//列头居中
view.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
//内容居中
view.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
//设置行号
view.CustomDrawRowIndicator += EventExtend.Gridview_CustomDrawRowIndicator;
view.IndicatorWidth = 30;//设置行号宽度
// 0条记录时显示自定义的字符提示/显示
if (view.RowCount == 0)
{
view.CustomDrawEmptyForeground += EventExtend.GridView_CustomDrawEmptyForeground;
}
}
catch (Exception)
{
throw new Exception("初始化 GridView 出错!!");
}
}
//设置行号
public static void Gridview_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
{
//列头“序号”
if (e.Info.Kind == DevExpress.Utils.Drawing.IndicatorKind.Header)
{
e.Appearance.DrawBackground(e.Cache, e.Bounds);
e.Appearance.DrawString(e.Cache, "序号", e.Bounds);
e.Handled = true;
}
if (e.Info.IsRowIndicator && e.RowHandle >= 0)
{
e.Info.DisplayText = (e.RowHandle + 1).ToString();
}
//else
//{
// e.Info.Appearance.BackColor = System.Drawing.Color.AntiqueWhite;
// e.Info.DisplayText = "G" + e.RowHandle.ToString();
//}
}
//0行记录时,显示自定义字符提示
public static void GridView_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
{
string str = "没有数据记录!";
System.Drawing.Font f = new System.Drawing.Font("宋体", 10, FontStyle.Bold);
Rectangle r = new Rectangle(e.Bounds.Left + 5, e.Bounds.Top + 5, e.Bounds.Width - 5, e.Bounds.Height - 5);
e.Graphics.DrawString(str, f, Brushes.Black, r);
}
(3)绑定数据源
this.gridControl.DataSource = dt_AllIssues;
(4)某一列添加超链接
如上面的Issue_Id列,增加一个超链接,点击可直接打开网页,主要用到了Dev 的HyperLinkEdit
找到对应列Issue_Id,绑定刚刚添加的HyperLinkEdit
打开超链接:
//打开超链接
private void gridView_IssuesList_RowCellClick(object sender, RowCellClickEventArgs e)
{
try
{
if (e.Column.Name.Equals("Issue_Id"))
{
int selectedRowIndex = this.gridView_IssuesList.GetSelectedRows()[0];
string issues_id = this.gridView_IssuesList.GetRowCellValue(selectedRowIndex, "Issue_Id").ToString();
string url = Issue_URL + issues_id;//因为不想Issue_Id列显示很长一个URL,所以代码内处理成URL
//数据源Issue_Id处理成URL
//string url = this.gridView_IssuesList.GetRowCellValue(selectedRowIndex, "Issue_Id").ToString();
System.Diagnostics.Process.Start(url);
}
}
catch (Exception ex)
{
Utility.Log.WriteSysLog("ProjectSearch," + MethodBase.GetCurrentMethod().Name, ex);
Console.WriteLine(ex.ToString());
XtraMessageBox.Show("操作不成功,请重试或与管理员联系!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
注:这里有个问题,HyperLinkEdit控件只与一列绑定,同一个HyperLinkEdit控件不能用于GridView的多列。此外,如果同一列很多行数据,Issue_Id都不一样,是不同的URL,此时,如果设置HyperLinkEdit的Caption为Issue_URL + issues_id,那么界面中Issue_Id列将为相同的一个URL。这是因为HyperLinkEdit只能绑定一次数据。这样导出到Excel的数据,所有Issue_Id的超链接为同一URL,这个地方弄了一两天。最后是通过重写Excel文件,添加超链接实现的。Spire.XLS for .NET 是一个专业的处理Excel的组件。https://www.e-iceblue.com/Introduce/excel-for-net-introduce.html#.WxaBQO6FOUk
实现的界面如下:
导出到Excel的数据:
(5)GridControl实现右键菜单
如下图,点击某行,右键弹出菜单
GridView添加事件
//国家网格菜单
private void gridView_OutTestCountryList_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
{
try
{
if (e.MenuType == DevExpress.XtraGrid.Views.Grid.GridMenuType.Row)//选中行右键菜单
{
if (e.HitInfo.InRow)//选中一行
{
GridViewMenu menu = e.Menu as GridViewMenu;
DXMenuItem dxm = new DXMenuItem("编辑", new EventHandler(GridView_OutTestCountryList_Menu_ItemClick));//添加菜单项“编辑”,并绑定菜单点击事件
menu.Items.Add(dxm);
dxm = new DXMenuItem("删除", new EventHandler(GridView_OutTestCountryList_Menu_ItemClick));//添加菜单项“删除”,并绑定菜单点击事件
menu.Items.Add(dxm);
//delegate 通过+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法
//dxm.Click += new EventHandler(GridViewMenu_ItemClick);
}
}
}
catch (Exception ex)
{
Utility.Log.WriteSysLog("OutTestCountry_Set," + MethodBase.GetCurrentMethod().Name, ex);
MessageBox.Show("操作不成功,请重试或与管理员联系!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//国家网格右键菜单单击事件
private void GridView_OutTestCountryList_Menu_ItemClick(object sender, EventArgs e)
{
try
{
int index = this.gridView_OutTestCountryList.GetSelectedRows()[0];//获得选中行
string country_code = this.gridView_OutTestCountryList.GetRowCellValue(index, "country_code").ToString(); //国家代码
string country_name_ch = this.gridView_OutTestCountryList.GetRowCellValue(index, "country_name_ch").ToString();//国家名(中文)
string country_name_en = this.gridView_OutTestCountryList.GetRowCellValue(index, "country_name_en").ToString();//国家名(英文)
DXMenuItem dxm = sender as DXMenuItem;
if (dxm.Caption.Equals("编辑"))
{
//编辑处理逻辑
}
else if (dxm.Caption.Equals("删除"))
{//删除处理逻辑
if (MessageBox.Show("确定删除国家【 " + country_name_ch + "】及其对应所有城市吗?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
BLL.Project.OutTestCountry.Delete_CountryAndCity(country_code);
MessageBox.Show("删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
DataTable dt = (DataTable)this.gridControl_Country.DataSource;
string filter = "country_code = '" + country_code + "'";
int length = dt.Select(filter).Length;
if (length > 0)//该行已经存在 删除
{
DataRow dr = dt.Select(filter)[0];
dt.Rows.Remove(dr);
this.gridControl_Country.DataSource = dt;
}
this.gridControl_City.DataSource = null;
}
}
}
catch (Exception ex)
{
Utility.Log.WriteSysLog("OutTestCountry_Set," + MethodBase.GetCurrentMethod().Name, ex);
MessageBox.Show("操作不成功,请重试或与管理员联系!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
3.RibbonControl工具栏
(1)在工具箱中找到RibbonControl和RibbonStatusBar拖到From窗体中。
RibbonControl停靠在窗体上方,RibbonStatusBar停靠在窗体下方,如下图所示:
(2)工具箱中拖动一个PanelControl控件到窗体中,并选择“停靠在父容器中”。
(3)如果想更改窗体皮肤样式,可从工具箱中拖动一个DefaultLookAndFeel到窗体中
选中DefaultLookAndFeel,修改属性:SkinName,选择一个皮肤主题
(4)接下来是设计菜单栏
下图是官网文档中对RibbonControl的图示,https://documentation.devexpress.com/WindowsForms/2492/Controls-and-Libraries/Ribbon-Bars-and-Menu/Ribbon/The-Ribbon-UI/Ribbon-Control。
这个菜单的布局跟Word、Excel很像,所以比较好理解。
下图右上角点击箭头,选择“Run Designer”,就可以设计像Word一样的菜单栏了。
首先添加一个ribbonPage,Text设置Page名,如下“项目管理”即是一个RibbonPage
选中刚刚添加的RibbonPage,添加一个RibbonPageGroup,如下图中的“项目”。然后,选中刚添加的RibbonPageGroup(项目),添加BarButton ,如下图所示的“问题查询”、“日报生成”、“项目状态”等。
最终,菜单如下图所示:
此外,还可以选中RibbonPageGroup,如上图中的“项目”,右键添加BarButton。
先写这些,后面再补充。