DevExpress控件LookUpEdit、GridControl、RibbonControl的使用总结

本篇文章主要介绍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。

先写这些,后面再补充。

猜你喜欢

转载自blog.csdn.net/nancy50/article/details/80585989