【WinForm】Dev GridControl 使用汇总
一、表头设置
1、禁用列头筛选(过滤)
GridControl属性搜索AllowFilter,设置为false
2、改变表头颜色(或改变绑定的Skin样式)
方法一:
改变GridControl自定义column Header背景颜色属性
在Form窗体上拖放了一个GridControl,尝试修改列头 column header 背景颜色. 但是修改AppearanceHeaderPanel 属性后,并没有效果出现, 我使用的是 Outlook 默认皮肤 。
后来发现原因是GridControl的Header使用了Devexpress皮肤中的图片作为背景。如果你想手动更改ColumnHeader的背景色,可以这样做:
1)设置 GridControl的LookAndFeel.UseDefaultLookAndFeel 属性为 False
2)设置 GridControl 的LookAndFeel.Style 属性为 Flat( UltraFlat 或 Style3D)
3)设置 GridColumn.AppearanceHeader.BackColor 为你需要的颜色。
方法二:
使用SkinEditor创建自定义的皮肤,这个不难,因为是继承的Devexpress皮肤模板,在皮肤中移除列头的图片背景或者更换需要的图片背景。
http://www.360doc.com/content/11/0425/19/6832513_112260508.shtml
如果有其他地方皮肤需要自定义可以选择第二种方式。
方法三:
实现 GridView.CustomDrawColumnHeader 事件
3、禁用右击标题列弹出右键菜单
设置Run Design->OptionsMenu->EnableColumnMenu 设置为:false
4、禁用列排序
5、让各列头禁止移动
设置gridView1.OptionsCustomization.AllowColumnMoving = false;
6、禁止改变列宽/自适应列宽
(1)列表宽度自适应内容
gridview1.BestFitColumns();
(2)禁止各列头改变列宽
设置gridView1.OptionsCustomization.AllowColumnResizing = false;
(3)根据内容自动调整列宽
gridView_1.Columns["TestInfo"].BestFit();
注意:
1)如果是动态添加列,一定要在绑定数据源以后再设置,否则gridView_1.Columns["TestInfo"]为Null导致报错;
2)一定要在数据源改变后设置,否则无效。
(4)列宽填满表格
gv_Show.OptionsView.ColumnAutoWidth = true;
这样就不显示水平滚动条了。
7、设某一列文字和标题居中显示
gridView1.Columns[0].AppearanceHeader.TextOptions.HAlignment =DevExpress.Utils.HorzAlignment.Center;
gridView1.Columns[0].AppearanceCell.TextOptions.HAlignment =DevExpress.Utils.HorzAlignment.Center;
8、设置冻结列(左冻结)
gridView1.Columns[0].Fixed= DevExpress.XtraGrid.Columns.FixedStyle.Left;
二、行、列、单元格设置
1、改变单元格颜色
https://bbs.csdn.net/topics/350220798
2、设置隔行变色、焦点行颜色
https://www.cnblogs.com/starksoft/p/4936207.html
private void gv_Step_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.RowHandle == gv_Step.FocusedRowHandle) { //e.Appearance.ForeColor = Color.Red;//字体颜色 e.Appearance.BackColor = Color.Green;//行背景颜色 } }
3、设置焦点行
gridView2.FocusedRowHandle = dtselected.Rows.Count - 1;
4、设置点击选择一行而不是一个单元格
this.gridView1.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
this.gridView1.OptionsSelection.EnableAppearanceFocusedCell = false;
5、设置单元格、列不可编辑
(1)整个表不能编辑
View->OptionsBehavior->Editable 设置为:false
(2)单元格不可编辑
private void LinkGridView_ShowingEditor(object sender, CancelEventArgs e)
{
if (LinkGridView.FocusedColumn.FieldName == "name1" || LinkGridView.FocusedColumn.FieldName == "name2")
{
int row = this.LinkGridView.FocusedRowHandle;
string ss = LinkGridView.GetRowCellDisplayText(row, LinkGridView.Columns["Xx"]);
string ss2 = LinkGridView.GetRowCellDisplayText(row, LinkGridView.Columns["xX"]);
if (ss.Contains("xx") || ss2.Contains("xxx"))
{
e.Cancel = true;//该行不可编辑
}
}
}
(3)单独设置某列编辑使能
gridView1.Columns["Col1"].OptionsColumn.AllowEdit = true;//设置列可以编辑
6、隐藏编辑单元格时右击弹出复制/粘贴等操作的英文菜单
例如该可编辑单元格的ColumnEdit属性绑定了一个RepositoryItemTextEdit,命名为tb_TaskName。
该菜单其实是在这个TextEdit上弹出的,所以要改变这个控件的右键事件:
private void tb_TaskName_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
///用一个空的菜单取代原来的系统菜单
ContextMenu emptyMenu = new ContextMenu();
tb_TaskName.ContextMenu = emptyMenu;
}
}
7、选中某行
gridView1.SelectRow(i);
三、其他
1、隐藏GroupPanel表头
设置Run Design->OptionsView->ShowGroupPanel 设置为:false
2、显示水平滚动条
设置this.gridView.OptionsView.ColumnAutoWidth = false;
3、定位到指定记录
定位到第一条数据/记录: 设置 this.gridView.MoveFirst()
定位到下一条数据/记录: 设置 this.gridView.MoveNext()
定位到最后一条数据/记录:设置 this.gridView.MoveLast()
4、读写拷贝权限设置
只读不可拷贝:
ColumnViewOptionsBehavior.Editable = False
只读可拷贝:
ColumnViewOptionsBehavior.Editable = True
OptionsColumn.AllowEdit = True
OptionsColumn.ReadOnly = True
可编辑:
ColumnViewOptionsBehavior.Editable = True
OptionsColumn.AllowEdit = True
OptionsColumn.ReadOnly = False
5、修改最上面的GroupPanel内容
gridView1.GroupPanelText="xxx";
四、GridControl绑定、更新数据源
1、GridControl绑定数据源
https://blog.csdn.net/weixin_34391854/article/details/93839053
2、GridControl数据修改后实时更新数据源
https://www.cnblogs.com/Jingkunliu/p/4125744.html
五、绑定的数据源有值但不显示的问题
解决方法:
1、检查数据源是否有值;
2、用
gridView1.RefreshData();
gc.RefreshDataSource() 更新数据源
3、绑定的顺序很重要。尝试在更新数据源之前加上gc.DataSource = dt;
4、如果是绑定List,那么list里的类字段定义时必须按照get;set;形式来写
六、使用GridFormatRule规则改变行/单元格样式
1、用法示例
设置方法(官方):
(1)https://docs.devexpress.com/WindowsForms/DevExpress.XtraEditors.FormatConditionRuleExpression
直接代码调用:https://blog.csdn.net/duanzi_peng/article/details/78791513
public static void SetPowerContrlRule(DevExpress.XtraGrid.Views.Grid.GridView gv_Show) { try { DevExpress.XtraGrid.GridFormatRule gridFormatRule1 = new DevExpress.XtraGrid.GridFormatRule(); DevExpress.XtraEditors.FormatConditionRuleValue formatConditionRuleValue1 = new DevExpress.XtraEditors.FormatConditionRuleValue(); gridFormatRule1.ApplyToRow = true; gridFormatRule1.Column = gv_Show.Columns["DataType"]; gridFormatRule1.Name = "Format0"; formatConditionRuleValue1.Appearance.ForeColor = System.Drawing.Color.Red; formatConditionRuleValue1.Appearance.Options.UseForeColor = true; formatConditionRuleValue1.Condition = DevExpress.XtraEditors.FormatCondition.Expression; formatConditionRuleValue1.Expression = "[DataType] = 1"; gridFormatRule1.Rule = formatConditionRuleValue1; gv_Show.FormatRules.Add(gridFormatRule1); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
2、当判断依据为字符时,要加引号
Expression = "[结果] == '不合格'"
七、单元格绑定图片
https://www.cnblogs.com/wuhuacong/p/9145765.html
八、双击行事件
https://www.cnblogs.com/xiaofengfeng/archive/2011/09/15/2177625.html
九、从表格获取数据
1、得到当前选定记录某字段的值
sValue=Table.Rows[gridView1.FocusedRowHandle][FieldName].ToString();
2、得到单元格数据(0行0列)
string ss=gridView1.GetRowCellDisplayText(0,gridView1.Columns[0]);
string ss = gridView1.GetRowCellValue(0, gridView1.Columns[0]);
3、得到列标题的值
DevExpress.XtraGrid.Columns.GridColumn col = gridView1.Columns[0];第一个列标题
十、自动增加序号
GridView添加事件:
private void gv_1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) { if (e.Info.IsRowIndicator && e.RowHandle > -1) { e.Info.DisplayText = (e.RowHandle + 1).ToString(); } }
同时设定宽度:
gv_Msg.IndicatorWidth = 30;
十一、选中行事件
选中事件有两个:
focusedRowChanged()
selectionChanged()
当选择模式为单行时,须使用focusedRowChanged()
若选中行不想覆盖整行原本颜色,则设定:
gridView1.OptionsSelection.EnableAppearanceFocusedRow = false;//默认选中行不变色 gridView1.OptionsSelection.EnableAppearanceFocusedCell = false;//默认选中单元格不变色
十二、上移、下移
DataTable dtPostgreSql = new DataTable(); gridControl1.DataSource = dtPostgreSql;
if (gridView1.SelectedRowsCount < 1) { MessageBox.Show("未选中任何行"); return; } if (gridView1.SelectedRowsCount == 1) { int selectIndex = this.gridView1.GetDataSourceRowIndex(this.gridView1.FocusedRowHandle); if (selectIndex - 1 >= 0) { object[] ot = dtPostgreSql.Rows[selectIndex].ItemArray; DataRow dr = dtPostgreSql.Rows[selectIndex]; dtPostgreSql.Rows.Remove(dr); DataRow drs = dtPostgreSql.NewRow(); drs.ItemArray = ot; dtPostgreSql.Rows.InsertAt(drs, selectIndex - 1); gridView1.FocusedRowHandle = selectIndex - 1; dtPostgreSql.AcceptChanges(); } else MessageBox.Show("已到第一行不能继续上移"); } if (gridView1.SelectedRowsCount > 1) { int[] index = new int[gridView1.SelectedRowsCount]; int[] rows = gridView1.GetSelectedRows(); int j=0; if (rows[0] - 1 >= 0) { for (int i = rows[0]; i < rows[rows.Length - 1] + 1; i++) { object[] ot = dtPostgreSql.Rows[i].ItemArray; DataRow dr = dtPostgreSql.Rows[i]; dtPostgreSql.Rows.Remove(dr); DataRow drs = dtPostgreSql.NewRow(); drs.ItemArray = ot; dtPostgreSql.Rows.InsertAt(drs, i - 1); index[j] = i - 1; j++; } gridView1.SelectRows(index[0], index[index.Length - 1]); dtPostgreSql.AcceptChanges(); }else MessageBox.Show("已到第一行不能继续上移"); }
下移:
if (gridView1.SelectedRowsCount < 1) { MessageBox.Show("未选中任何行"); return; } if (gridView1.SelectedRowsCount >= 1) { int[] index = new int[gridView1.SelectedRowsCount]; int[] rows = gridView1.GetSelectedRows(); int j = 0; if (rows[rows.Length - 1] <= gridView1.RowCount-2) { for (int i = rows[rows.Length - 1]; i > rows[0]- 1; i--) { object[] ot = dtPostgreSql.Rows[i].ItemArray; DataRow dr = dtPostgreSql.Rows[i]; dtPostgreSql.Rows.Remove(dr); DataRow drs = dtPostgreSql.NewRow(); drs.ItemArray = ot; dtPostgreSql.Rows.InsertAt(drs, i +1); index[j] = i +1; j++; } gridView1.SelectRows(index[0], index[index.Length - 1]); dtPostgreSql.AcceptChanges(); } else MessageBox.Show("已到最后一条记录不能继续下移"); }
参考:https://blog.csdn.net/fangyu723/article/details/104971670
十三、添加勾选框
1、普通效果
GridControl控件要设置为不可编辑状态,在“OptionsBehavior”下将“Editable”的值改为false,否则左键单击不管用。
进入“Run Designer”添加三列,在添加该列时将其属性[ColumnEdit]从下拉框中选择“CheckEdit”,然后打开该属性的下来箭头,设置其“ValueChecked”和“ValueUnChecked”的类型及值,这里我用了int类型的1和0来作为状态的指示。
【注:最好还是不要用默认的Bool型的true和false,这样容易出现总是无法显示打钩选中的情况,但是用int型的就不会出现此情况;我找到问题所在了:因为我用了ToString函数,这时会自动把true或者false改变为大写的“True”或“False”,因此判断时就不正确】
选中GridControl的GridView,然后添加其事件“RowClick”,添加事件代码如下:
private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { string midValueStr = gridView1.GetDataRow(e.RowHandle)["select"].ToString(); if (midValueStr == "0" || midValueStr == "") { gridView1.GetDataRow(e.RowHandle)["select"] = 1; } else { gridView1.GetDataRow(e.RowHandle)["select"] = 0; } }
注:if条件中的空值判断,我的这一列是在数据库取出数据后新添加的,所以其值取出来是空的,而不是0.因此,该行未选中时可能有两种值即0和空。
出处:链接
2、实现单选、复选效果
https://blog.csdn.net/weixin_55972850/article/details/126052837
3、实现表格列头全选复选框
gridview.OptionsSelection.MultiSelect = true; gridview.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CheckBoxRowSelect; gridview.OptionsSelection.ShowCheckBoxSelectorInColumnHeader = DevExpress.Utils.DefaultBoolean.True;
设置某行勾选:
gridview.SelectRow(index);
设置取消勾选:
gridview.UnselectRow(index);
获取勾选行索引:
int[] sel = gridview.GetSelectedRows();
判断某行是否勾选:
if(!gridview.IsRowSelected(i)) { continue; }
勾选事件处理:
绑定事件: gridview.SelectionChanged += new DevExpress.Data.SelectionChangedEventHandler(gv_SelectionChanged); private void gv_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e) { int row = gridview.FocusedRowHandle; if (gridview.IsRowSelected(row)) { } }
十四、单独修改某一单元格的值
gv.SetRowCellValue(gv.FocusedRowHandle, gv.Columns[colNames[j]], rowValues.ToArray()[i][j].ToString());
十五、添加右键菜单
1.从工具箱中拖拽一个标准控件ContextMenuStrip到窗体中;
2.点击控件右上方的小三角,添加成员子菜单MenuItem,注意顶端出现的名称;
3.在gdc(不是gdv)控件的ContextMenuStrip属性中选择刚才创建的控件contextPopMenu;
4.添加gdv控件的PopupMenuShowing事件,处理点击右键后,弹出菜单前的处理机制;
5.在PopupMenuShowing事件中可根据当前选中行状态,判断是否弹出菜单,如
if (!btAlterFlt.Enabled) //编辑状态解钩弹出菜单和控件的关系,实现右键无操作 gdcFlts.ContextMenuStrip = null; else gdcFlts.ContextMenuStrip = contextPopMenu; MenuItemEnterBuffer.Text = $"加入缓冲区 ({buffer.Count})"; //改写菜单项名称
6.在contextPopMenu控件的ItemClicked事件进行处理。
右键点击某菜单项后,gdv的焦点也会切换到当前行,可在此事件中通过FocusRowHandel获取。
参考:链接
十六、删除行
intiSelectRowCount = dgv.SelectedRowsCount; if(iSelectRowCount > 0) { dgv.DeleteSelectedRows(); }
十七、动态添加勾选列、下拉框列、文本列
1 private void BindShowCol() 2 { 3 int index = 0; 4 DevExpress.XtraGrid.Columns.GridColumn col = null; 5 6 //////////////添加勾选框 7 col = new DevExpress.XtraGrid.Columns.GridColumn(); 8 col.FieldName = "Check"; 9 col.Caption = "选择"; 10 11 col.Width = 40; 12 col.VisibleIndex = index++; 13 col.Visible = true; 14 DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit ck = new DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit(); 15 ck.AutoHeight = false; 16 ck.Name = "ck"; 17 ck.CheckedChanged += new System.EventHandler(ck_CheckedChanged); 18 col.ColumnEdit = ck; 19 gv_Show.Columns.Add(col); 20 21 //////////////添加下拉框 22 col = new DevExpress.XtraGrid.Columns.GridColumn(); 23 col.FieldName = "Col1"; 24 col.Caption = "Col1"; 25 col.Width = 100; 26 col.VisibleIndex = index++; 27 col.Visible = true; 28 29 DevExpress.XtraEditors.Repository.RepositoryItemComboBox cb_Col1 = new DevExpress.XtraEditors.Repository.RepositoryItemComboBox(); 30 cb_Col1.Items.AddRange(ComboItems); 31 cb_Col1.AllowNullInput = DevExpress.Utils.DefaultBoolean.False; 32 cb_Col1.SelectedIndexChanged += new EventHandler(cb_Col1_SelectedIndexChanged); 33 cb_Col1.Name = "cb_Col1"; 34 35 col.ColumnEdit = cb_Col1; 36 gv_Show.Columns.Add(col); 37 38 //////////////添加文本框 39 col = new DevExpress.XtraGrid.Columns.GridColumn(); 40 col.FieldName = "Col2"; 41 col.Caption = "Col2"; 42 col.Width = 100; 43 col.VisibleIndex = index++; 44 col.OptionsColumn.AllowEdit = false;//设置列不可以编辑 45 gv_Show.Columns.Add(col); 46 47 col = new DevExpress.XtraGrid.Columns.GridColumn(); 48 col.FieldName = "Col3"; 49 col.Caption = "Col3"; 50 col.Width = 100 ; 51 col.VisibleIndex = index++; 52 col.OptionsColumn.AllowEdit = false;//设置列不可以编辑 53 gv_Show.Columns.Add(col); 54 55 ///设置表头居中,单元格内容居中 56 gv_Show.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; 57 gv_Show.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; 58 }
十八、根据点击的行号动态改变下拉框选项
1 private void gv_Show_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) 2 { 3 int CurrentRow = gv_Show.FocusedRowHandle; 4 if (CurrentRow < 0) 5 { 6 return; 7 } 8 9 DevExpress.XtraEditors.Repository.RepositoryItemComboBox cb_Col1 = new DevExpress.XtraEditors.Repository.RepositoryItemComboBox(); 10 if (CurrentRow == 1 || CurrentRow == 3) 11 { 12 ComboItems = new string[2] { "1", "2" }; 13 } 14 else 15 { 16 ComboItems = new string[3] { "A", "B", "C" }; 17 } 18 19 cb_Col1.Items.AddRange(ComboItems); 20 cb_Col1.AllowNullInput = DevExpress.Utils.DefaultBoolean.False; 21 cb_Col1.SelectedIndexChanged += new EventHandler(cb_Col1_SelectedIndexChanged); 22 cb_Col1.Name = "cb_Col1"; 23 24 gv_Show.Columns["Col1"].ColumnEdit = cb_Col1; 25 } 26 }
注意:同时存在勾选框和下拉框时:
(1)如果通过CustomRowCellEditForEditing这个事件,使用e.RepositoryItem = cb_Col1来处理的话,会影响勾选列,无法实现目标效果。
(2)如果使用Click、MouseDown这些事件,事件触发在选项框弹出之后,也就是点击下拉框时显示的还是改变之前的内容,下一次点击才是更新的内容。
十九、单元格合并
1、纵向单元格合并
https://blog.csdn.net/GuangXing_HuangXuLin/article/details/117299587
注意:设置了基偶数行变颜色会让单元格合并事件失效。
2、横向向单元格合并
试过这个:
https://blog.csdn.net/Learn_change_myself/article/details/107791117
内容显示是可以跨单元格的,但是合并单元格的边框线依旧显示。但暂时没找到能改进的方法。
待验证:https://blog.csdn.net/guo3165935/article/details/43561227
3、利用高级带区网格视图实现合并单元格
参考:https://www.cnblogs.com/strive-boy/p/16113369.html
上图例子效果:
要实现合并效果,需要在设计器选择视图AdvBandedGridView:
在CreateColumn()函数中添加代码:
advBandedGridView1.SetColumnPosition(name, 0, 0); advBandedGridView1.SetColumnPosition(age, 1, 0); advBandedGridView1.SetColumnPosition(gender, 1, 1); advBandedGridView1.SetColumnPosition(school, 0, 0); advBandedGridView1.SetColumnPosition(classs, 0, 0); //AutoFillDown设置为 true。 列标头将被自动拉伸,来占用它下面的任何空白间隔。 school.AutoFillDown = true; classs.AutoFillDown = true; //或者设置classs.RowCount = 2; // 要在带区之间移动列,则使用列的 BandedGridColumn.OwnerBand 属性 //name.OwnerBand = gridBand1; //age.OwnerBand = gridBand1; //gender.OwnerBand = gridBand1; //school.OwnerBand = gridBand2; //classs.OwnerBand = gridBand2; // 仅当 BandedGridOptionsCustomization.AllowChangeColumnParent 选项被启用时,才可以在带区之间移动列。 否则,只能在父带区内移动列。
可以按自己的需求添加外观属性设置:
public void SetBrandGridContrlProperties(AdvBandedGridView gv_Show) { gv_Show.Name = "gv_ShowRX"; //禁用列编辑 gv_Show.OptionsBehavior.ReadOnly = true; gv_Show.OptionsBehavior.Editable = false; //禁用列筛选 gv_Show.OptionsCustomization.AllowFilter = false; //禁用列排序 gv_Show.OptionsCustomization.AllowSort = false; gv_Show.OptionsDetail.EnableMasterViewMode = false; gv_Show.OptionsFilter.FilterEditorUseMenuForOperandsAndOperators = false;//隐藏GridControl的GroupPanel表头 gv_Show.OptionsView.ShowGroupPanel = false; //禁用右击标题列弹出右键菜单 gv_Show.OptionsMenu.EnableColumnMenu = false; gv_Show.Appearance.HeaderPanel.Options.UseTextOptions = true; gv_Show.Appearance.Row.Options.UseTextOptions = true; gv_Show.OptionsView.RowAutoHeight = true; gv_Show.ScrollStyle = DevExpress.XtraGrid.Views.Grid.ScrollStyleFlags.LiveHorzScroll; ///设置表头居中,单元格内容居中 gv_Show.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; gv_Show.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; }
效果:
二十、动态根据条件设置行样式
private void gridView6_RowStyle(object sender,DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
{
GridView View = sender as GridView;
if (e.RowHandle >= 0)
{
object needAlert =View.GetRowCellValue(e.RowHandle, View.Columns["needAlert"]);
if (needAlert != null &needAlert != DBNull.Value && needAlert.ToString().Trim() !="0" & View.GetRowCellValue(e.RowHandle,View.Columns["Value"]) != DBNull.Value)
{
decimal AverValue = Convert.ToDecimal(View.GetRowCellValue(e.RowHandle, View.Columns["Value"]));
objectMinValue = View.GetRowCellValue(e.RowHandle,View.Columns["MinValue"]);
objectMaxVlaue = View.GetRowCellValue(e.RowHandle,View.Columns["MaxValue"]);
if(MinValue != DBNull.Value & MinValue != null & MaxVlaue.ToString() !="" & MaxVlaue != DBNull.Value && MaxVlaue != null &MaxVlaue.ToString() != "")
{
decimal gridColumn2 = Convert.ToDecimal(MinValue);
decimal gridColumn1 = Convert.ToDecimal(MaxVlaue);
if (gridColumn2 > AverValue || AverValue > gridColumn1)
{
e.Appearance.ForeColor = Color.Red;
e.Appearance.BackColor = Color.LightGray;
}
}
}
}
}
二十一、单元格加边框颜色
private void Form1_Load(object sender, System.EventArgs e)
{
new DevExpress.XtraGrid.Design.XViewsPrinting(gridControl1);
}
private void gridView1_CustomDrawCell(object sender,
DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
{
GridView view = sender as GridView;
if (e.Column == view.FocusedColumn && e.RowHandle == view.FocusedRowHandle)
{
CellDrawHelper.DoDefaultDrawCell(view, e);
CellDrawHelper.DrawCellBorder(e);
e.Handled = true;
}
}
CellDrawHelper.cs:
public static class CellDrawHelper
{
public static void DrawCellBorder(DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
{
Brush brush = Brushes.Black;
e.Graphics.FillRectangle(brush, new Rectangle(e.Bounds.X - 1, e.Bounds.Y - 1, e.Bounds.Width
+ 2, 2));
e.Graphics.FillRectangle(brush, new Rectangle(e.Bounds.Right - 1, e.Bounds.Y - 1, 2,
e.Bounds.Height + 2));
e.Graphics.FillRectangle(brush, new Rectangle(e.Bounds.X - 1, e.Bounds.Bottom - 1,
e.Bounds.Width + 2, 2));
e.Graphics.FillRectangle(brush, new Rectangle(e.Bounds.X - 1, e.Bounds.Y - 1, 2,
e.Bounds.Height + 2));
}
public static void DoDefaultDrawCell(GridView view, RowCellCustomDrawEventArgs e)
{
PropertyInfo pi;
GridControl grid;
GridViewInfo info;
GridCellInfo cell;
GridEditorContainerHelper helper;
GridViewDrawArgs args;
info = view.GetViewInfo() as GridViewInfo;
cell = e.Cell as GridCellInfo;
grid = view.GridControl;
pi = grid.GetType().GetProperty("EditorHelper", BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.DeclaredOnly);
helper = pi.GetValue(grid, null) as GridEditorContainerHelper;
args = new GridViewDrawArgs(e.Cache, info, e.Bounds);
e.Appearance.FillRectangle(e.Cache, e.Bounds);
helper.DrawCellEdit(args, cell.Editor, cell.ViewInfo, e.Appearance,
cell.CellValueRect.Location);
}
}
二十二、改变指定行的颜色
需求:想做出按列表顺序执行的效果,执行到改行就变色,并且执行到下一行后上一行颜色不恢复。
试过用设置焦点行的方式实现,但行失去焦点后颜色就恢复了。最后还是通过根据字段内容改变行背景颜色:
绑定RowStyle事件:
gv_Step.RowStyle += new DevExpress.XtraGrid.Views.Grid.RowStyleEventHandler(gv_Step_RowStyle);
当字段Result为1时颜色为绿色,0时为默认控件颜色,TestProcess是行绑定的类:
private void gv_Step_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
{
int hand = e.RowHandle;
if (hand < 0) return;
TestProcess salesDocCount = gv_Step.GetRow(hand) as TestProcess;
if (salesDocCount == null) return;
if (salesDocCount.Result == "1")
{
e.Appearance.BackColor = Color.Green;;
}
else
{
e.Appearance.BackColor = Color.White;
}
}
执行过程中设定焦点行,实现执行到改行就变色:
//设置焦点行
m_List[TestProcessIndex].Result = "1";//更改数据源
this.BeginInvoke(new Action(() => { gv_Step.FocusedRowHandle = TestProcessIndex;}));
TestProcessIndex++;//当前执行的行号
重复执行该列表的话要刷新数据源,并刷新控件,让颜色恢复到都没有执行时的颜色:
for (int i = 0; i < m_List.Count; i++)
{
m_List[i].Result = "0";
}
gv_Step.FocusedRowHandle = 0; gc_Step.BeginInit();//刷新控件,否则颜色不恢复 gc_Step.EndInit();
注:用这个方法在执行过程中点击其他行的话,颜色会乱(比如已变为绿色的行又恢复到原来的颜色)。直接禁用整个GridControl的话又无法拖动滑动条了,但也没找到禁止选择行的属性。可以在焦点改变事件中把当前焦点行设为刚刚设定的焦点TestProcessIndex,实现禁止选中行的需求:
private void gv_Step_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { gv_Step.FocusedRowHandle = TestProcessIndex; }
这样颜色不会乱, 也能控制滑动条了。
根据相似的原理,该功能用添加规则方式也可以实现,参见本文第六大点。
参考:https://blog.csdn.net/weixin_43976890/article/details/107004102
二十三、按表格字段实现多层分组
/// <summary> /// 添加列 /// </summary> private void BindGroup() { int index = 0; DevExpress.XtraGrid.Columns.GridColumn col = null; //第1列 col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = string.Format("Col{0}", index); col.Caption = string.Format("Col{0}", index); col.Width = 100; col.VisibleIndex = index++; col.OptionsColumn.AllowEdit = false;//设置列不可以编辑 //Group设置 col.GroupIndex = 0;//列为第一组 gv_Group.Columns.Add(col); //第2列 col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = string.Format("Col{0}", index); col.Caption = string.Format("Col{0}", index); col.Width = 100; col.VisibleIndex = index++; col.OptionsColumn.AllowEdit = false;//设置列不可以编辑 //Group设置 col.SortOrder = DevExpress.Data.ColumnSortOrder.Ascending; //按升序排列 gv_Group.Columns.Add(col); //第3列 col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = string.Format("Col{0}", index); col.Caption = string.Format("Col{0}", index); col.Width = 100; col.VisibleIndex = index++; col.OptionsColumn.AllowEdit = false;//设置列不可以编辑 //Group设置 col.SummaryItem.DisplayFormat = "最大值:{0}"; //显示格式 col.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Max;//统计出最大值 gv_Group.Columns.Add(col); //第4列 col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = string.Format("Col{0}", index); col.Caption = string.Format("Col{0}", index); col.Width = 100; col.VisibleIndex = index++; col.OptionsColumn.AllowEdit = false;//设置列不可以编辑 //Group设置 col.GroupIndex = 1;//列为第二组 gv_Group.Columns.Add(col); //组名格式可由 GroupFormat设置 } /// <summary> /// 动态绑定数据 /// </summary> private void BindGroupSource() { for (int i = 0; i < 6; i++) { DataGroup_DT.Columns.Add(string.Format("Col{0}", i), typeof(string)); } for (int i = 0; i < 10; i++) { DataRow dr = DataGroup_DT.NewRow(); if (i % 2 == 0) { dr["Col0"] = "A"; } else { dr["Col0"] = "B"; } dr["Col1"] = 2 * (i + 1); dr["Col2"] = 3 * (i + 1); if (i < 5) { dr["Col3"] = "aa"; } else { dr["Col3"] = "bb"; } DataGroup_DT.Rows.Add(dr); } gc_Group.DataSource = DataGroup_DT; gv_Group.ExpandAllGroups();//展开所有组 //gv_Group.OptionsBehavior.Editable = true; //gv_Group.OptionsBehavior.ReadOnly = false; //汇总结果是显示在Footer面板中的,gridView中的Footer面板默认是不显示的,所以必须要先设置 gv_Group.OptionsView.ShowFooter = true;//是否显示页脚 //添加组计算 //gv_Group.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "Col2", gv_Group.Columns["Col2"], "组计:{0}"); //设置Col3为备注 gv_Group.OptionsView.ShowPreview = true;//是否显示备注 gv_Group.PreviewFieldName = "Col3"; }
效果:
参考:https://blog.csdn.net/qq_33459369/article/details/79992054
更简单的分组方法:
https://www.cnblogs.com/qingtian-jlj/p/6063597.html
关键代码:
gv_Show.Columns["DirName"].GroupIndex = 0;//设置分组列(该值默认均为-1,即不分组)
gv_Show.OptionsBehavior.AutoExpandAllGroups = true;//展开所有分组
会自动按指定的列名来分组显示。
二十四、实现主从表(数据源List嵌套)
1、例子
创建类:
/// <summary> /// 书橱主表类 /// </summary> public class bookcase { public string id { get; set; } public string bcid { get; set; } public string name { get; set; } /// <summary> /// books /// </summary> public List<book> books1 { get; set; } public List<book> books2 { get; set; } } /// <summary> /// 书本从表类 /// </summary> public class book { public string id { get; set; } //书橱id public string bookcase_bid { get; set; } public string bookName { get; set; } }
//书橱(主表) List<bookcase> bookcaseList = new List<bookcase>(); public void BindData() { List<string> ColNames = new List<string>() { "id", "bcid", "name", "id", "bookcase_bid", "bookName" }; List<string> caption1 = new List<string>() { "书橱序号", "书橱ID", "书橱名称", "书本序号", "书本ID", "书本名称" }; //DevExpress.XtraGrid.Columns.GridColumn col1 = null; int colIndex = 0; for (int i = 0; i < 3; i++) { DevExpress.XtraGrid.Columns.GridColumn col1 = new DevExpress.XtraGrid.Columns.GridColumn(); col1.FieldName = ColNames[i]; col1.Caption = caption1[i]; col1.Width = 100; col1.VisibleIndex = colIndex++; col1.OptionsColumn.AllowEdit = false;//设置列不可以编辑 gridView1.Columns.Add(col1); } for (int i = 3; i < ColNames.Count; i++) { DevExpress.XtraGrid.Columns.GridColumn col1 = new DevExpress.XtraGrid.Columns.GridColumn(); col1.FieldName = ColNames[i]; col1.Caption = caption1[i]; col1.Width = 100; col1.VisibleIndex = colIndex++; col1.OptionsColumn.AllowEdit = false;//设置列不可以编辑 gridView2.Columns.Add(col1); } for (int i = 3; i < ColNames.Count; i++) { DevExpress.XtraGrid.Columns.GridColumn col1 = new DevExpress.XtraGrid.Columns.GridColumn(); col1.FieldName = ColNames[i]; col1.Caption = caption1[i]; col1.Width = 100; col1.VisibleIndex = colIndex++; col1.OptionsColumn.AllowEdit = false;//设置列不可以编辑 gridView3.Columns.Add(col1); } gridControl1.DataSource = bookcaseList; //for (int i = 0; i < gridView1.Columns.Count; i++) //{ // col1.FieldName = ColNames[i]; // gridView1.Columns[i].Caption = caption1[i]; //} //ExpandAllRows(gridView1); gridView2.ViewCaption = "书单1"; gridView3.ViewCaption = "书单2"; for (int i = 0; i < gridControl1.ViewCollection.Count; i++) { DevExpress.XtraGrid.Views.Grid.GridView gv = (DevExpress.XtraGrid.Views.Grid.GridView)gridControl1.ViewCollection[i]; SetGridContrl(gv); gv.OptionsSelection.MultiSelect = true; gv.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.RowSelect; gv.OptionsSelection.InvertSelection = false; gv.OptionsSelection.EnableAppearanceFocusedCell = false; //ExpandAllRows(gv); gv.OptionsBehavior.AutoExpandAllGroups = true;//展开所有分组 } gridControl1.DoubleClick += new EventHandler((s, evn) => gv_DoubleClick(s, evn)); } //添加数据源 private void btn_Refresh_Click(object sender, EventArgs e) { //书橱顺序ID,书橱ID,顺序名称 for (int i = 0; i < 3; i++) { bookcase bkcase1 = new bookcase(); bkcase1.id = i.ToString(); bkcase1.bcid = i.ToString(); bkcase1.name = "bkcase" + i.ToString(); bkcase1.books1 = new List<book>(); bkcase1.books2 = new List<book>(); for (int j = 0; j < 4; j++) { book bk1 = new book(); bk1.id = j.ToString(); bk1.bookcase_bid = i.ToString(); bk1.bookName = "book1-" + j.ToString(); bkcase1.books1.Add(bk1); book bk2 = new book(); bk2.id = j.ToString(); bk2.bookcase_bid = i.ToString(); bk2.bookName = "book2-" + j.ToString(); bkcase1.books2.Add(bk2); } bookcaseList.Add(bkcase1); } gridControl1.DataSource = null; gridControl1.DataSource = bookcaseList; }
折叠:
(gridControl1.MainView as GridView).CollapseAllDetails(); //要折叠主视图中的所有主控行
展开:
public void ExpandAllRows(GridView view) { view.BeginUpdate(); try { int dataRowCount = view.DataRowCount; for (int rHandle = 0; rHandle < dataRowCount; rHandle++) view.SetMasterRowExpanded(rHandle, true); } finally { view.EndUpdate(); } }
效果:
2、点击从表获取选中行的数据
private void gridView1_MasterRowExpanded(object sender, CustomMasterRowEventArgs e) { GridView master = sender as GridView; GridView detail = master.GetDetailView(e.RowHandle, e.RelationIndex) as GridView; }
参考链接:https://blog.csdn.net/guojlh/article/details/45726755
二十五、添加按钮列
https://blog.csdn.net/fangyu723/article/details/106046457
DevExpress.XtraGrid.Columns.GridColumn col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = "OnOff"; col.Caption = "开关"; col.Width = 10; col.VisibleIndex = index++; col.Visible = true; DevExpress.XtraEditors.Repository.RepositoryItemToggleSwitch ts = new DevExpress.XtraEditors.Repository.RepositoryItemToggleSwitch(); ts.AutoHeight = true; ts.LookAndFeel.UseDefaultLookAndFeel = false; //ts.LookAndFeel.SkinMaskColor = Color.FromArgb(204, 0, 0); ts.Name = "ts"; ts.Toggled += new EventHandler(ts_Toggled); col.ColumnEdit = ts; gv_Ctrl.Columns.Add(col); DT_Ctrl.Columns.Add(col.FieldName, typeof(bool));
实现事件:
private void ts_Toggled(object sender, EventArgs e) { DevExpress.XtraEditors.ToggleSwitch ts = sender as DevExpress.XtraEditors.ToggleSwitch; int CurrentRow = gv_Ctrl.FocusedRowHandle; if (CurrentRow < 0) { return; } .... }
二十六、单元格编辑完毕事件
//gridcontrol输入验证 private void gdv_reguline_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e) { int col =((DevExpress.XtraGrid.Views.Grid.GridView)sender).FocusedColumn.AbsoluteIndex; if (col == 4 || col == 5) { object v = e.Value; int tm; if (v != null && (!Int32.TryParse(v.ToString(),out tm) || tm<0 )) //自定义验证逻辑 { e.Valid = false; //控制是否通过验证的开关 e.ErrorText = "必须输入正整数!"; //提示的验证失败的原因 } } }
参考:https://blog.csdn.net/caoyanchao1/article/details/121440257
二十七、同步两个GridControl的滚动条
private void gridview1_TopRowChanged(object sender, EventArgs e) { gridview2.TopRowIndex = (sender as GridView).TopRowIndex; }
二十八、插入颜色列
col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = “col”; col.Caption = “color”; DevExpress.XtraEditors.Repository.RepositoryItemColorEdit ce = new DevExpress.XtraEditors.Repository.RepositoryItemColorEdit(); ce.CustomDisplayText += new CustomDisplayTextEventHandler(ColorEdit_CustomDisplayText);//控制文本不显示 ce.ColorAlignment = HorzAlignment.Center; ce.AutoHeight = true; ce.Name = "ce"; col.ColumnEdit = ce; gridview.Columns.Add(col); //绑定数据源 datatable.Columns.Add(“Value”, typeof(Color)); gridcontrol.DataSource = datatable.;
赋值:
for (int i = 0; i < 10; i++) { DataRow dr = DT_Signal.NewRow(); dr["Value"] = Color.DarkGray; datatable.Rows.Add(dr); }
不显示文本的事件:
private void ColorEdit_CustomDisplayText(object sender, CustomDisplayTextEventArgs e) { e.DisplayText = ""; }
参考:https://supportcenter.devexpress.com/ticket/details/t721796/i-want-to-hide-the-grid-coloredit-text
二十九、插入图片列
DevExpress.XtraEditors.Repository.RepositoryItemPictureEdit img = new DevExpress.XtraEditors.Repository.RepositoryItemPictureEdit(); img.AutoHeight = true; img.Name = "img"; col.ColumnEdit = img;
当不单元格赋值null时,会显示:
让单元格显示空白的方法:
img.NullText = " ";
注意一定是有空格的" "而不是""。