DevExpress gridLookUpEdit 实现多选
一:创建类GridCheckMarksSelection
#region Fileds
RepositoryItemGridLookUpEdit _currentRepository; protected ArrayList selection;
protected String checkColumnFieldName = "CheckMarkSelection";
RepositoryItemCheckEdit edit;
const Int32 CheckboxIndent = ;
#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 = ; 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 = ; 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 = ; 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) != -;
}
#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 = ;
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 * - , );
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 = ;
GraphicsInfo.Default.AddGraphics(null);
try
{
width = info.CalcBestFit(GraphicsInfo.Default.Graphics).Width;
}
finally
{
GraphicsInfo.Default.ReleaseGraphics();
}
return width + CheckboxIndent * ;
} 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
二:实例化该类并调用相关多选方法(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 > ) { 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 > ) { 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;
}
三:获取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"] = "";
dt.Rows.Add(row);
}
}
}
}
}
DevExpress gridLookUpEdit 实现多选的更多相关文章
- DevExpress XtraTreeList的复选框 禁用
树的2个事件代码如下,通过节点的tag判断是否禁用节点前的复选框.树的节点加载时设置要禁用的节点tag为-1,不禁用的则设为相关的值 private void treeListPer_CustomDr ...
- DevExpress XtraGrid RepositoryItemCheckEdit 复选框多选的解决方法
1. RepositoryItemCheckEdit默认有三种状态,选中状态.未选中状态和半选中状态(半选中状态通常用在TreeList中如果父节点下的子节点有选中的有未选中的,则父节点状态为半选中状 ...
- 实现DataGridView和DevExpress.GridControl表头全选功能
1)DevExpress控件的GridView的实现多选操作 先讲DevExpress控件的GridView的实现,要实现的功能基本上是处理单击全选操作.重新绘制表头等操作,首先在加载第一步实现相关的 ...
- DevExpress内 GridControl中复选框值问题
在DevExpress的 GridControl内的复选柜勾选后,界面看到是勾选状态,但对应的DataView的值仍未变,在以下事件内处理 在对应的DataView内的 CellValueChangi ...
- DevExpress下拉多选框 CheckComboboxEdit、CheckedListBoxControl
CheckComboboxEdit //清空项 checkedComboBoxEdit1.Properties.Items.Clear(); //自定义数组 ...
- DevExpress XtraTreeList TreeList复选框选择
权限管理涉及复选框多勾选. 1.控件属性设置 TreeList.OperationView.ShowCheckBoxes=true;用于显示CheckBox: TreeList.OperationBe ...
- Winform中设置和获取DevExpress的RadioGroup的选中项的value值
场景 Winform中实现读取xml配置文件并动态配置ZedGraph的RadioGroup的选项: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- DevExpress GridView 整理(转)
DevExpress GridView 那些事儿 1:去除 GridView 头上的 "Drag a column header here to group by that column&q ...
- DevExpress GridView 那些事儿
1:去除 GridView 头上的 "Drag a column header here to group by that column" --> 点击 Run Desig ...
随机推荐
- 从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写字母。
#include<iostream> #include<vector> #include<string> using namespace std; int main ...
- 《C++ 并发编程》- 第1章 你好,C++的并发世界
<C++ 并发编程>- 第1章 你好,C++的并发世界 转载自并发编程网 – ifeve.com 本文是<C++ 并发编程>的第一章,感谢人民邮电出版社授权并发编程网发表此文, ...
- 如何在 PHP 中处理 Protocol Buffers 数据
Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高 ...
- SQL Server 之 在数据库之间进行数据导入导出
1.同一服务器上数据库之间进行数据导入导出 (1).使用 SELECT INTO 导出数据 在SQL Server中使用最广泛的就是通过SELECT INTO语句导出数据,SELECT INTO语句同 ...
- Android(java)学习笔记106-2:反射机制
1.反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 两个UIView添加同一个手势只有最后一个有用
首先这个思路是不对的,因为每一个Gesture Recognizer关联一个View,但是一个View可以关联多个Gesture Recognizer,因为一个View可能还能响应多种触控操作方式.当 ...
- Android AdapterView 源码分析以及其相关回收机制的分析
忽然,发现,网上的公开资料都是教你怎么继承一个baseadapter,然后重写那几个方法,再调用相关view的 setAdpater()方法, 接着,你的item 就显示在手机屏幕上了.很少有人关注a ...
- zabbix电话告警V1
最近决定将夜班值班人员取消,夜里告警采用机器人电话通知.总结一下这么几个情况,有问题还请指出,希望也能给大家多一个思路. V1做的太糙了,预计年初上V2 一.用谁家的服务 费用我没有太关注,主要就是看 ...
- 关于Windows下如何查看端口占用和杀掉进程
更详细博客参见: http://www.cnblogs.com/chenwenbiao/archive/2012/06/24/2559954.html 或可参考:http://www.cnblogs. ...
- BZOJ 3831
3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 121 Solved: 68[Submit][S ...