• 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   }
  • 相关阅读:
    解决AD原理图中无法输入中文的问题
    [编程题-京东]小球的距离
    [编程题-京东]上台阶
    [编程题-搜狐]发奖金
    [编程题-搜狐]扎金花
    [leetcode]最长递增序列
    [编程题-搜狐]马戏团
    [编程题-蘑菇街] 投篮游戏
    [编程题-蘑菇街]聊天
    [编程题-蘑菇街]回文串
  • 原文地址:https://www.cnblogs.com/xihong2014/p/10756820.html
Copyright © 2020-2023  润新知