概述:本文分享了 DevExpress Gridview下拉框repositoryItemComboBox控件的实现过程。
- DevExpress使用教程:如何实现Dashboard中的数据操作
- DevExpress使用教程:富文本编辑器RichEditControl
- DevExpress使用教程:使用ChartControl绘制多重坐标图形
- DevExpress使用教程:GridView经验小结
- DevExpress使用教程:Form窗体经验小结
- DevExpress使用教程:向GridControl添加进度条控件
- DevExpress使用教程:常用Winform界面封装
- DevExpress使用教程:XtraGrid常见用法
- DevExpress使用教程:PopupMenu使用心得
- DevExpress使用教程:窗体换肤
- DevExpress使用教程:Gridview下拉框
- DevExpress使用教程:添加非绑定列
- DevExpress XtraReport和微软RDLC报表的详细对比分析
- DevExpress使用教程:XtraGridControl动态添加右键菜单
- DevExpress使用教程:PDF、Word、Excel文档的预览及操作处理
- DevExpress使用教程:手把手教你用官方汉化资源做汉化
- DevExpress使用教程:利用WizardControl构建多步向导界面
- 图文详解!DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用
- 图文详解!DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
- 【实例】如何利用控件完成Winforms图形化界面设计
【DXperience Universal Suite下载】
【DevExpress Gridview下拉框repositoryItemComboBox控件的实现】一、绑定前准备
这一部分基本上是一些基础的知识,但也有些地方要注意的。
1、添加下拉框列
在Grid Designer中,添加一列,在这列的ColumnEdit熟悉中,可以选择这列的编辑样式,比如让这列是一个按钮或者选择框等等,这里我们选择下拉框,如图:
这个下拉框默认被命名为repositoryItemComboBox1,我们对这列的操作,就是对repositoryItemComboBox1的操作。
2、为gridview添加bindingSource
这里要用bindingSource作为数据源,这是为了实 现在repositoryItemComboBox1选择了一个值之后,gridview能够将它显示,repositoryItemComboBox的 很大一个缺陷就是当你选择一个值之后,不能像传统gridview下拉框那样,会让他显示在gridview中,而且当你鼠标点击另外一个单元格之后,就 会消失,变成空白或原来的数据。所以需要用bindingSource来绑定一个datatable,当repositoryItemComboBox1 选择一个值之后,将值传给datatable对应的列,当点击另外一个单元格或者其他地方时,bindingSource会刷新绑定的 datatable。
二、绑定数据
我在窗体加载的时候,调用了一个BindDataSource()的自定义方法,这个方法是实现为repositoryItemComboBox1绑定选 择值以及为bindingSource绑定一个datatable 。BindDataSource()代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private void BindDataSource() { //1.为repositoryItemComboBox1绑定数据 for ( int i = 0 ;
i < 3 ;
i++) { CboItemEntity item = new CboItemEntity();
item.Text = "这是" + i;
item.Value = https://www.it610.com/article/i;
repositoryItemComboBox1.Items.Add(item);
} //2.为bindingSource绑定一个datatable dt = InitDt();
bindingSource1.DataSource = dt;
} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class CboItemEntity { private object _text = 0 ;
private object _Value = https://www.it610.com/article/ "" ;
/// /// 显示值 /// public object Text { get { return this ._text;
} set { this ._text = value;
} } /// /// 对象值 /// public object Value { get { return this ._Value;
} set { this ._Value = https://www.it610.com/article/value;
} } public override string ToString() { return this .Text.ToString();
} } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private DataTable InitDt() { dt.Columns.Add( "check" , typeof (bool));
dt.Columns.Add( "id" , typeof ( int ));
dt.Columns.Add( "name" , typeof (string));
dt.Columns.Add( "sex" , typeof ( int ));
dt.Columns.Add( "address" , typeof (string));
dt.Columns.Add( "aihao" , typeof (string));
dt.Columns.Add( "shuju" , typeof (decimal));
dt.Columns.Add( "time" , typeof (DateTime));
dt.Columns.Add( "zidingyi" , typeof (string));
dt.Columns.Add( "value" , typeof ( int ));
dt.Columns.Add( "text" , typeof (string));
dt.Rows.Add( new object[] { 0 , 1 , "张三" , 1 , "东大街6号" , "看书" , - 52.874 , "2011-8-5 17:52:55" , "###" , 0 , "这是0" });
dt.Rows.Add( new object[] { 0 , 6 , "张三" , 1 , "东大街6号" , "看书" , - 52.874 , "2011-8-5 17:52:55" , "###" , 1 , "这是1" });
dt.Rows.Add( new object[] { 0 , 11 , "张三" , 1 , "东大街6号" , "看书" , - 52.874 , "2011-8-5 17:52:55" , "###" , 2 , "这是2" });
return dt;
} |
三、repositoryItemComboBox的处理
完成上述的内容,当我们运行程序的时候,会发现,datagridview显示datatable中的值,下拉框有我们绑定的数据,但是当我在下拉框中选 择一个值离开后,gridview不会显示我们选中的值,而是回到原值。我们就要想办法让我们选中一个值时,保存到datatable中,这样当我们离开 后,bindingSource自然会刷新gridview,以达到显示选中值的效果。
(1)那么如何实现将选中的值保存到datatable,因为我们的bindingSource绑定的是一个全局的datatable,所以只要获取到选 中值,很容易就能给datatable赋值,到这里容易被难住,因为我们不能像对待其他控件一样,在他的属性中找到他的某某事件,双击进入代码编写,我们 找不到查看repositoryItemComboBox1的属性界面。那就另寻道路,利用委托,于是,我们在之前的BindDataSource()方法中,加入一个委托方法,BindDataSource()代码变为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void BindDataSource() { //1.为repositoryItemComboBox1绑定数据 for ( int i = 0 ;
i < 3 ;
i++) { CboItemEntity item = new CboItemEntity();
item.Text = "这是" + i;
item.Value = https://www.it610.com/article/i;
repositoryItemComboBox1.Items.Add(item);
} //2.为bindingSource绑定一个datatable dt = InitDt();
bindingSource1.DataSource = dt;
//3.下拉框选中值改变事件 repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged);
} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void ComboBoxEdit_SelectedIndexChanged(object sender, EventArgs e) { CboItemEntity item = new CboItemEntity();
try { //1.获取下拉框选中值 item = (CboItemEntity)(sender as ComboBoxEdit).SelectedItem;
string text = item.Text.ToString();
int value =https://www.it610.com/article/( int )item.Value;
//2.获取gridview选中的行 GridView myView=(gridControl1.MainView as GridView);
int dataIndex = myView.GetDataSourceRowIndex(myView.FocusedRowHandle);
//3.保存选中值到datatable dt.Rows[dataIndex][ "value" ] = value;
dt.Rows[dataIndex][ "text" ] = text;
} catch (Exception ex) { XtraMessageBox.Show(ex.Message, "提示" );
} } |
解决办法是,继续在BindDataSource()中添加一个委托方法解决它,BindDataSource()代码变为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private void BindDataSource() { //1.为repositoryItemComboBox1绑定数据 for ( int i = 0 ;
i < 3 ;
i++) { CboItemEntity item = new CboItemEntity();
item.Text = "这是" + i;
item.Value = https://www.it610.com/article/i;
repositoryItemComboBox1.Items.Add(item);
} //2.为bindingSource绑定一个datatable dt = InitDt();
bindingSource1.DataSource = dt;
//3.下拉框选中值改变事件 repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged);
//4.解决IConvertible问题 repositoryItemComboBox1.ParseEditValue += new ConvertEditValueEventHandler(repositoryItemComboBox1_ParseEditValue);
} |
1 2 3 4 | void repositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e) { e.Value = https://www.it610.com/article/e.Value.ToString();
e.Handled = true ;
} |
Via博客园i小白