DevExpress Grid使用checkBox选中的方法

到官网得到消息自13.2版本后的Dev Grid中均内置了CheckBox列多选功能。在寻找答案的过程的成果进行记录。

一、13.2版本以后用法

    1. 启用多选列 
      对Gird中的View进行以下属性设置: 
      gridView1.OptionsSelection.MultiSelect = true;
       gridView1.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
    2. 清除当前选择 
      在选中列时后,可配置在选中列以外的地方点击时候会清除当前的选择。14以后才有此功能 
      gridView1.OptionsSelection.ResetSelectionClickOutsideCheckboxSelector = true;
    3. 获取选中的行

      二、早起版本实现

      相关链接:http://www.devexpress.com/Support/Center/Example/Details/E1271

      1. GridCheckMarksSelection类 
          1 public class GridCheckMarksSelection {
          2         protected GridView _view;
          3         protected ArrayList selection;
          4         GridColumn column;
          5         RepositoryItemCheckEdit edit;
          6         const int CheckboxIndent = 4;
          7 
          8         public GridCheckMarksSelection()           {
          9             selection = new ArrayList();
         10         }
         11 
         12         public GridCheckMarksSelection(GridView view) : this() {
         13             View = view;
         14         }
         15         public GridView View {
         16             get { return _view; }
         17             set {
         18                 if (_view != value) {
         19                     Detach();
         20                     Attach(value);
         21                 }
         22             }
         23         }
         24         public GridColumn CheckMarkColumn { get { return column; } }
         25 
         26         public int SelectedCount { get { return selection.Count; } }
         27         public object GetSelectedRow(int index) {
         28             return selection[index];
         29         }
         30         public int GetSelectedIndex(object row) {
         31             return selection.IndexOf(row);
         32         }
         33         public void ClearSelection() {
         34             selection.Clear();
         35             Invalidate();
         36         }
         37         public void SelectAll() {
         38             selection.Clear();
         39             // fast (won't work if the grid is filtered)
         40             //if(_view.DataSource is ICollection)
         41             //    selection.AddRange(((ICollection)_view.DataSource));
         42             //else
         43             // slow:
         44             for (int i = 0; i < _view.DataRowCount; i++)
         45                 selection.Add(_view.GetRow(i));
         46             Invalidate();
         47         }
         48         public void SelectGroup(int rowHandle, bool select) {
         49             if (IsGroupRowSelected(rowHandle) && select) return;
         50             for (int i = 0; i < _view.GetChildRowCount(rowHandle); i++) {
         51                 int childRowHandle = _view.GetChildRowHandle(rowHandle, i);
         52                 if (_view.IsGroupRow(childRowHandle))
         53                     SelectGroup(childRowHandle, select);
         54                 else
         55                     SelectRow(childRowHandle, select, false);
         56             }
         57             Invalidate();
         58         }
         59         public void SelectRow(int rowHandle, bool select) {
         60             SelectRow(rowHandle, select, true);
         61         }
         62         public void InvertRowSelection(int rowHandle) {
         63             if (View.IsDataRow(rowHandle)) {
         64                 SelectRow(rowHandle, !IsRowSelected(rowHandle));
         65             }
         66             if (View.IsGroupRow(rowHandle)) {
         67                 SelectGroup(rowHandle, !IsGroupRowSelected(rowHandle));
         68             }
         69         }
         70         public bool IsGroupRowSelected(int rowHandle) {
         71             for (int i = 0; i < _view.GetChildRowCount(rowHandle); i++) {
         72                 int row = _view.GetChildRowHandle(rowHandle, i);
         73                 if (_view.IsGroupRow(row)) {
         74                     if (!IsGroupRowSelected(row)) return false;
         75                 } else
         76                     if (!IsRowSelected(row)) return false;
         77             }
         78             return true;
         79         }
         80         public bool IsRowSelected(int rowHandle) {
         81             if (_view.IsGroupRow(rowHandle))
         82                 return IsGroupRowSelected(rowHandle);
         83 
         84             object row = _view.GetRow(rowHandle);
         85             return GetSelectedIndex(row) != -1;
         86         }
         87 
         88         protected virtual void Attach(GridView view) {
         89             if (view == null) return;
         90             selection.Clear();
         91             this._view = view;
         92             view.BeginUpdate();
         93             try {
         94                 edit = view.GridControl.RepositoryItems.Add("CheckEdit") as RepositoryItemCheckEdit;
         95 
         96                 column = view.Columns.Add();
         97                 column.OptionsColumn.AllowSort = DevExpress.Utils.DefaultBoolean.False;
         98                 column.Visible = true;
         99                 column.VisibleIndex = 0;
        100                 column.FieldName = "CheckMarkSelection";
        101                 column.Caption = "Mark";
        102                 column.OptionsColumn.ShowCaption = false;
        103                 column.OptionsColumn.AllowEdit = false;
        104                 column.OptionsColumn.AllowSize = false;
        105                 column.UnboundType = DevExpress.Data.UnboundColumnType.Boolean;
        106                 column.Width = GetCheckBoxWidth();
        107                 column.ColumnEdit = edit;
        108 
        109                 view.Click += new EventHandler(View_Click);
        110                 view.CustomDrawColumnHeader += new ColumnHeaderCustomDrawEventHandler(View_CustomDrawColumnHeader);
        111                 view.CustomDrawGroupRow += new RowObjectCustomDrawEventHandler(View_CustomDrawGroupRow);
        112                 view.CustomUnboundColumnData += new CustomColumnDataEventHandler(view_CustomUnboundColumnData);
        113                 view.KeyDown += new KeyEventHandler(view_KeyDown);
        114                 view.RowStyle += new RowStyleEventHandler(view_RowStyle);
        115             } finally {
        116                 view.EndUpdate();
        117             }
        118         }
        119         protected virtual void Detach() {
        120             if (_view == null) return;
        121             if (column != null)
        122                 column.Dispose();
        123             if (edit != null) {
        124                 _view.GridControl.RepositoryItems.Remove(edit);
        125                 edit.Dispose();
        126             }
        127 
        128             _view.Click -= new EventHandler(View_Click);
        129             _view.CustomDrawColumnHeader -= new ColumnHeaderCustomDrawEventHandler(View_CustomDrawColumnHeader);
        130             _view.CustomDrawGroupRow -= new RowObjectCustomDrawEventHandler(View_CustomDrawGroupRow);
        131             _view.CustomUnboundColumnData -= new CustomColumnDataEventHandler(view_CustomUnboundColumnData);
        132             _view.KeyDown -= new KeyEventHandler(view_KeyDown);
        133             _view.RowStyle -= new RowStyleEventHandler(view_RowStyle);
        134 
        135             _view = null;
        136         }
        137         protected int GetCheckBoxWidth() {
        138             DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo info = edit.CreateViewInfo() as DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo;
        139             int width = 0;
        140             GraphicsInfo.Default.AddGraphics(null);
        141             try {
        142                 width = info.CalcBestFit(GraphicsInfo.Default.Graphics).Width;
        143             } finally {
        144                 GraphicsInfo.Default.ReleaseGraphics();
        145             }
        146             return width + CheckboxIndent * 2;
        147         }
        148         protected void DrawCheckBox(Graphics g, Rectangle r, bool Checked) {
        149             DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo info;
        150             DevExpress.XtraEditors.Drawing.CheckEditPainter painter;
        151             DevExpress.XtraEditors.Drawing.ControlGraphicsInfoArgs args;
        152             info = edit.CreateViewInfo() as DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo;
        153             painter = edit.CreatePainter() as DevExpress.XtraEditors.Drawing.CheckEditPainter;
        154             info.EditValue = Checked;
        155             info.Bounds = r;
        156             info.CalcViewInfo(g);
        157             args = new DevExpress.XtraEditors.Drawing.ControlGraphicsInfoArgs(info, new DevExpress.Utils.Drawing.GraphicsCache(g), r);
        158             painter.Draw(args);
        159             args.Cache.Dispose();
        160         }
        161         void Invalidate() {
        162             _view.CloseEditor();
        163             _view.BeginUpdate();
        164             _view.EndUpdate();
        165         }
        166         void SelectRow(int rowHandle, bool select, bool invalidate) {
        167             if (IsRowSelected(rowHandle) == select) return;
        168             object row = _view.GetRow(rowHandle);
        169             if (select)
        170                 selection.Add(row);
        171             else
        172                 selection.Remove(row);
        173             if (invalidate) {
        174                Invalidate();
        175             }
        176         }
        177         voidview_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e) {
        178             if (e.Column == CheckMarkColumn) {
        179                 if (e.IsGetData)
        180                     e.Value = IsRowSelected(View.GetRowHandle(e.ListSourceRowIndex));
        181                 else
        182                     SelectRow(View.GetRowHandle(e.ListSourceRowIndex), (bool)e.Value);
        183             }
        184         }
        185         voidview_KeyDown(object sender, KeyEventArgs e) {
        186             if (View.FocusedColumn != column || e.KeyCode != Keys.Space) return;
        187             InvertRowSelection(View.FocusedRowHandle);
        188         }
        189         voidView_Click(object sender, EventArgs e) {
        190             GridHitInfo info;
        191             Point pt = _view.GridControl.PointToClient(Control.MousePosition);
        192             info = _view.CalcHitInfo(pt);
        193             if (info.Column == column) {
        194                 if (info.InColumn) {
        195                     if (SelectedCount == _view.DataRowCount)
        196                         ClearSelection();
        197                     else
        198                         SelectAll();
        199                 }
        200                 if (info.InRowCell) {
        201                     InvertRowSelection(info.RowHandle);
        202                 }
        203             }
        204             if (info.InRow && _view.IsGroupRow(info.RowHandle) && info.HitTest != GridHitTest.RowGroupButton) {
        205                 InvertRowSelection(info.RowHandle);
        206             }
        207         }
        208         voidView_CustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e) {
        209             if (e.Column == column) {
        210                 e.Info.InnerElements.Clear();
        211                 e.Painter.DrawObject(e.Info);
        212                 DrawCheckBox(e.Graphics, e.Bounds, SelectedCount == _view.DataRowCount);
        213                 e.Handled = true;
        214             }
        215         }
        216         voidView_CustomDrawGroupRow(object sender, RowObjectCustomDrawEventArgs e) {
        217             DevExpress.XtraGrid.Views.Grid.ViewInfo.GridGroupRowInfo info;
        218             info = e.Info as DevExpress.XtraGrid.Views.Grid.ViewInfo.GridGroupRowInfo;
        219 
        220             info.GroupText = "" + info.GroupText.TrimStart();
        221             e.Info.Paint.FillRectangle(e.Graphics, e.Appearance.GetBackBrush(e.Cache), e.Bounds);
        222             e.Painter.DrawObject(e.Info);
        223 
        224             Rectangle r = info.ButtonBounds;
        225             r.Offset(r.Width + CheckboxIndent * 2 - 1, 0);
        226             DrawCheckBox(e.Graphics, r, IsGroupRowSelected(e.RowHandle));
        227             e.Handled = true;
        228         }
        229         voidview_RowStyle(object sender, RowStyleEventArgs e) {
        230             if (IsRowSelected(e.RowHandle)) {
        231                 e.Appearance.BackColor = SystemColors.Highlight;
        232                 e.Appearance.ForeColor = SystemColors.HighlightText;
        233             }
        234         }
        235     }
        GridCheckMarksSelection类
      2. 使用方法 
        1 public Form1()
        2  {
        3       InitializeComponent();
        4       new GridCheckMarksSelection(gridView1);
        5   }

posted on 2019-04-23 15:45  xihong  阅读(493)  评论(0编辑  收藏  举报

导航