首页 > 代码库 > DevExpress gridLookUpEdit 实现多选

DevExpress gridLookUpEdit 实现多选

一:创建类GridCheckMarksSelection  

技术分享
        #region Fileds        RepositoryItemGridLookUpEdit _currentRepository;        protected ArrayList selection;        protected String checkColumnFieldName = "CheckMarkSelection";        RepositoryItemCheckEdit edit;        const Int32 CheckboxIndent = 4;        #endregion        #region Construct        public GridCheckMarksSelection(RepositoryItemGridLookUpEdit repository)            : this()        {            CurrentRepository = repository;        }        public RepositoryItemGridLookUpEdit CurrentRepository        {            get { return _currentRepository; }            set            {                if (_currentRepository != value)                {                    Detach();                    Attach(value);                }            }        }        public GridCheckMarksSelection()        {            selection = new ArrayList();            this.OnSelectionChanged();        }        #endregion        #region Attribute        public ArrayList Selection        {            get { return selection; }            set { selection = value; }        }        public Int32 SelectedCount { get { return selection.Count; } }        #endregion        #region GridSelect        public object GetSelectedRow(Int32 index)        { return selection[index]; }        public Int32 GetSelectedIndex(object row)        { return selection.IndexOf(row); }        public void ClearSelection(GridView currentView)        {            selection.Clear();            Invalidate(currentView);            OnSelectionChanged();        }        public void SelectAll(object sourceObject)        {            selection.Clear();            if (sourceObject != null)            {                if (sourceObject is ICollection)                    selection.AddRange(((ICollection)sourceObject));                else                {                    GridView currentView = sourceObject as GridView;                    for (Int32 i = 0; i < currentView.DataRowCount; i++)                        selection.Add(currentView.GetRow(i));                    Invalidate(currentView);                }            }            this.OnSelectionChanged();        }        public delegate void SelectionChangedEventHandler(object sender, EventArgs e);        public event SelectionChangedEventHandler SelectionChanged;        public void OnSelectionChanged()        {            if (SelectionChanged != null)            {                EventArgs e = new EventArgs();                SelectionChanged(this, e);            }        }        public void SelectGroup(GridView currentView, Int32 rowHandle, bool select)        {            if (IsGroupRowSelected(currentView, rowHandle) && select) return;            for (Int32 i = 0; i < currentView.GetChildRowCount(rowHandle); i++)            {                Int32 childRowHandle = currentView.GetChildRowHandle(rowHandle, i);                if (currentView.IsGroupRow(childRowHandle))                    SelectGroup(currentView, childRowHandle, select);                else                    SelectRow(currentView, childRowHandle, select, false);            }            Invalidate(currentView);        }        public void SelectRow(GridView currentView, Int32 rowHandle, bool select)        {            SelectRow(currentView, rowHandle, select, true);        }        public void InvertRowSelection(GridView currentView, Int32 rowHandle)        {            if (currentView.IsDataRow(rowHandle))                SelectRow(currentView, rowHandle, !IsRowSelected(currentView, rowHandle));            if (currentView.IsGroupRow(rowHandle))                SelectGroup(currentView, rowHandle, !IsGroupRowSelected(currentView, rowHandle));        }        public bool IsGroupRowSelected(GridView currentView, Int32 rowHandle)        {            for (Int32 i = 0; i < currentView.GetChildRowCount(rowHandle); i++)            {                Int32 row = currentView.GetChildRowHandle(rowHandle, i);                if (currentView.IsGroupRow(row))                {                    if (!IsGroupRowSelected(currentView, row)) return false;                }                else                    if (!IsRowSelected(currentView, row)) return false;            }            return true;        }        public bool IsRowSelected(GridView currentView, Int32 rowHandle)        {            if (currentView.IsGroupRow(rowHandle))                return IsGroupRowSelected(currentView, rowHandle);            object row = currentView.GetRow(rowHandle);            return GetSelectedIndex(row) != -1;        }         #endregion        #region Attach|Detach        protected virtual void Attach(RepositoryItemGridLookUpEdit rep)        {            if (rep == null) return;            selection.Clear();            _currentRepository = rep;            edit = _currentRepository.View.GridControl.RepositoryItems.Add("CheckEdit") as RepositoryItemCheckEdit;            GridColumn column = _currentRepository.View.Columns.Add();            column.OptionsColumn.AllowSort = DevExpress.Utils.DefaultBoolean.False;            column.Visible = true;            column.VisibleIndex = 0;            column.FieldName = checkColumnFieldName;            column.Caption = "Mark";            column.OptionsColumn.ShowCaption = false;            column.OptionsColumn.AllowEdit = false;            column.OptionsColumn.AllowSize = false;            column.UnboundType = DevExpress.Data.UnboundColumnType.Boolean;            column.Width = GetCheckBoxWidth();            column.ColumnEdit = edit;            _currentRepository.View.Click += new EventHandler(View_Click);            _currentRepository.View.CustomDrawColumnHeader += new ColumnHeaderCustomDrawEventHandler(View_CustomDrawColumnHeader);            _currentRepository.View.CustomDrawGroupRow += new RowObjectCustomDrawEventHandler(View_CustomDrawGroupRow);            _currentRepository.View.CustomUnboundColumnData += new CustomColumnDataEventHandler(view_CustomUnboundColumnData);            _currentRepository.View.KeyDown += new KeyEventHandler(view_KeyDown);        }        protected virtual void Detach()        {            if (_currentRepository == null) return;            if (edit != null)            {                _currentRepository.View.GridControl.RepositoryItems.Remove(edit);                edit.Dispose();            }            _currentRepository.View.Click -= new EventHandler(View_Click);            _currentRepository.View.CustomDrawColumnHeader -= new ColumnHeaderCustomDrawEventHandler(View_CustomDrawColumnHeader);            _currentRepository.View.CustomDrawGroupRow -= new RowObjectCustomDrawEventHandler(View_CustomDrawGroupRow);            _currentRepository.View.CustomUnboundColumnData -= new CustomColumnDataEventHandler(view_CustomUnboundColumnData);            _currentRepository.View.KeyDown -= new KeyEventHandler(view_KeyDown);            _currentRepository = null;        }        void Invalidate(GridView currentView)        {            currentView.BeginUpdate();            currentView.EndUpdate();        }        void SelectRow(GridView currentView, Int32 rowHandle, bool select, bool invalidate)        {            if (IsRowSelected(currentView, rowHandle) == select) return;            object row = currentView.GetRow(rowHandle);            if (select)                selection.Add(row);            else                selection.Remove(row);            if (invalidate)                Invalidate(currentView);            OnSelectionChanged();        }        void view_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e)        {            GridView currentView = sender as GridView;            if (e.Column != null && e.Column.FieldName == checkColumnFieldName)            {                if (e.IsGetData)                    e.Value = IsRowSelected(currentView, currentView.GetRowHandle(e.ListSourceRowIndex));                else                    SelectRow(currentView, currentView.GetRowHandle(e.ListSourceRowIndex), (bool)e.Value);            }        }        void view_KeyDown(object sender, KeyEventArgs e)        {            GridView currentView = sender as GridView;            if (currentView.FocusedColumn.FieldName != checkColumnFieldName || e.KeyCode != Keys.Space) return;            InvertRowSelection(currentView, currentView.FocusedRowHandle);        }        void View_Click(object sender, EventArgs e)        {            GridHitInfo info;            GridView currentView = (sender as GridView);            Point pt = currentView.GridControl.PointToClient(Control.MousePosition);            info = currentView.CalcHitInfo(pt);            if (info.Column != null && info.Column.FieldName == checkColumnFieldName)            {                if (info.InColumn)                {                    if (SelectedCount == currentView.DataRowCount)                        ClearSelection(currentView);                    else                        SelectAll(currentView);                }                if (info.InRowCell)                    InvertRowSelection(currentView, info.RowHandle);            }            if (info.InRow && currentView.IsGroupRow(info.RowHandle) && info.HitTest != GridHitTest.RowGroupButton)                InvertRowSelection(currentView, info.RowHandle);        }        void View_CustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e)        {            if (e.Column != null && e.Column.FieldName == checkColumnFieldName)            {                e.Info.InnerElements.Clear();                e.Painter.DrawObject(e.Info);                DrawCheckBox(e.Graphics, e.Bounds, SelectedCount == (sender as GridView).DataRowCount);                e.Handled = true;            }        }        void View_CustomDrawGroupRow(object sender, RowObjectCustomDrawEventArgs e)        {            DevExpress.XtraGrid.Views.Grid.ViewInfo.GridGroupRowInfo info;            info = e.Info as DevExpress.XtraGrid.Views.Grid.ViewInfo.GridGroupRowInfo;            info.GroupText = "         " + info.GroupText.TrimStart();            e.Info.Paint.FillRectangle(e.Graphics, e.Appearance.GetBackBrush(e.Cache), e.Bounds);            e.Painter.DrawObject(e.Info);            Rectangle r = info.ButtonBounds;            r.Offset(r.Width + CheckboxIndent * 2 - 1, 0);            DrawCheckBox(e.Graphics, r, IsGroupRowSelected((sender as GridView), e.RowHandle));            e.Handled = true;        }        #endregion        #region CheckBox        protected Int32 GetCheckBoxWidth()        {            DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo info = edit.CreateViewInfo() as DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo;            Int32 width = 0;            GraphicsInfo.Default.AddGraphics(null);            try            {                width = info.CalcBestFit(GraphicsInfo.Default.Graphics).Width;            }            finally            {                GraphicsInfo.Default.ReleaseGraphics();            }            return width + CheckboxIndent * 2;        }        protected void DrawCheckBox(Graphics g, Rectangle r, bool Checked)        {            DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo info;            DevExpress.XtraEditors.Drawing.CheckEditPainter painter;            DevExpress.XtraEditors.Drawing.ControlGraphicsInfoArgs args;            info = edit.CreateViewInfo() as DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo;            painter = edit.CreatePainter() as DevExpress.XtraEditors.Drawing.CheckEditPainter;            info.EditValue = Checked;            info.Bounds = r;            info.CalcViewInfo(g);            args = new DevExpress.XtraEditors.Drawing.ControlGraphicsInfoArgs(info, new DevExpress.Utils.Drawing.GraphicsCache(g), r);            painter.Draw(args);            args.Cache.Dispose();        }        #endregion
View Code

二:实例化该类并调用相关多选方法(gridLookUpDevice为gridLookUpEdit控件名称,dt为gridLookUpDevice绑定的数据源)

     //添加CheckBox控件,实现多选
     this.gridLookUpDevice.Properties.View.OptionsSelection.MultiSelect = true;
     this.gridLookUpDevice.CustomDisplayText += new DevExpress.XtraEditors.Controls.CustomDisplayTextEventHandler(gridLookUpDevice_CustomDisplayText);

     GridCheckMarksSelection gridCheckMarksDevice;

     gridCheckMarksDevice = new GridCheckMarksSelection(gridLookUpDevice.Properties);

     gridCheckMarksDevice.SelectionChanged += new GridCheckMarksSelection.SelectionChangedEventHandler(gridCheckMarksDevice_SelectionChanged);

     gridCheckMarksDevice.SelectAll(dt.DefaultView);

     gridLookUpDevice.Properties.Tag = gridCheckMarksDevice;

技术分享
         private void gridCheckMarksDevice_SelectionChanged(object sender, EventArgs e)        {            if (ActiveControl is GridLookUpEdit)            {                StringBuilder sb = new StringBuilder();                foreach (DataRowView rv in (sender as GridCheckMarksSelection).Selection)                {                    if (sb.ToString().Length > 0) { sb.Append(", "); }                    sb.Append(rv["DeviceName"].ToString());                }                (ActiveControl as GridLookUpEdit).Text = sb.ToString();            }        }        private void gridLookUpDevice_CustomDisplayText(object sender, DevExpress.XtraEditors.Controls.CustomDisplayTextEventArgs e)        {            StringBuilder sb = new StringBuilder();            GridCheckMarksSelection gridCheckMark = sender is GridLookUpEdit ? (sender as GridLookUpEdit).Properties.Tag as GridCheckMarksSelection : (sender as RepositoryItemGridLookUpEdit).Tag as GridCheckMarksSelection;            if (gridCheckMark == null) return;            foreach (DataRowView rv in gridCheckMark.Selection)            {                if (sb.ToString().Length > 0) { sb.Append(", "); }                sb.Append(rv["DeviceName"].ToString());            }            e.DisplayText = sb.ToString();            deviceList = SelectAllDeviceCode(sender, e);            m_sender = sender;        }        private List<String> SelectAllDeviceCode(object sender, DevExpress.XtraEditors.Controls.CustomDisplayTextEventArgs e)        {            List<String> strDeviceCodeList = new List<String>();            GridCheckMarksSelection gridCheckMark = sender is GridLookUpEdit ? (sender as GridLookUpEdit).Properties.Tag as GridCheckMarksSelection : (sender as RepositoryItemGridLookUpEdit).Tag as GridCheckMarksSelection;            if (gridCheckMark == null) return null;            foreach (DataRowView rv in gridCheckMark.Selection)            {                String deviceCode = rv["DeviceCode"].ToString();                strDeviceCodeList.Add(deviceCode);            }            return strDeviceCodeList;        }
View Code

三:获取GridLookUpEdit选中的集合

技术分享
        private void ShowBarChart()        {            if (m_sender != null)            {                GridCheckMarksSelection gridCheckMark = m_sender is GridLookUpEdit ? (m_sender as GridLookUpEdit).Properties.Tag as GridCheckMarksSelection : (m_sender as RepositoryItemGridLookUpEdit).Tag as GridCheckMarksSelection;                if (gridCheckMark != null)                {                    foreach (DataRowView rowView in gridCheckMark.Selection)                    {                        String deviceCode = rowView.Row["DeviceCode"].ToString();                        String deviceName = rowView.Row["DeviceName"].ToString();                        if (!ls.Contains(deviceCode) && !String.IsNullOrWhiteSpace(deviceCode))                        {                            DataRow row = dt.NewRow();                            row["DeviceCode"] = deviceCode;                            row["DeviceName"] = deviceName;                            row["DeviceCount"] = "0";                            dt.Rows.Add(row);                        }                    }                }            }       }
View Code

DevExpress gridLookUpEdit 实现多选