DevExpress gridview下拉框repositoryItemComboBox的使用-阿里云开发者社区

开发者社区> jiankunking> 正文

DevExpress gridview下拉框repositoryItemComboBox的使用

简介: 原文  http://www.cnblogs.com/huangzhenhua/p/3898534.html 本以为DevExpress gridview中的下拉框会像比原来的datatgridview中的下拉框绑定数据简单好用,没想到费了老大劲,查阅各种资料总算是绑定上了数据,并且能够实现想要的效果。下面就详细写一下这个实现的过程,分享一下,同时也是对这个知识再次熟悉一
+关注继续查看

原文  http://www.cnblogs.com/huangzhenhua/p/3898534.html

本以为DevExpress gridview中的下拉框会像比原来的datatgridview中的下拉框绑定数据简单好用,没想到费了老大劲,查阅各种资料总算是绑定上了数据,并且能够实现想要的效果。下面就详细写一下这个实现的过程,分享一下,同时也是对这个知识再次熟悉一遍。

一、绑定前准备

这一部分基本上是一些基础的知识,但也有些地方要注意的。

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()代码如下:

private void BindDataSource()
    {
      //1.为repositoryItemComboBox1绑定数据
      for (int i = 0; i < 3; i++)
      {
        CboItemEntity item = new CboItemEntity();
        item.Text = "这是" + i;
        item.Value = i;
        repositoryItemComboBox1.Items.Add(item);
      }
      //2.为bindingSource绑定一个datatable
      dt = InitDt();
      bindingSource1.DataSource = dt;
    }

(1)在上述代码1( 1. 为repositoryItemComboBox1绑定数据 )中, CboItemEntity是一个实体类,代码如下:

public class CboItemEntity
    {
      private object _text = 0;
      private object _Value = "";
      /// <summary>
      /// 显示值
      /// </summary>
      public object Text
      {
        get { return this._text; }
        set { this._text = value; }
      }
      /// <summary>
      /// 对象值
      /// </summary>
      public object Value
      {
        get { return this._Value; }
        set { this._Value = value; }
      }

      public override string ToString()
      {
        return this.Text.ToString();
      }
    }

(2)在代码2( 2.为bindingSource绑定一个datatable )中,dt是一个全局变量,InitDt() 是一个自定义的创建一张datatable的方法,实际工作中,可以是从数据库中获取一张表等,我这里就以我创建的表为例, InitDt() 代码如下:

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;
    }

这里只需要注意最后两列就行了,value列是用来保存下拉框的实际值,text列是保存下拉框的选择值。

三、repositoryItemComboBox的处理

完成上述的内容,当我们运行程序的时候,会发现,datagridview显示datatable中的值,下拉框有我们绑定的数据,但是当我在下拉框中选择一个值离开后,gridview不会显示我们选中的值,而是回到原值。我们就要想办法让我们选中一个值时,保存到datatable中,这样当我们离开后,bindingSource自然会刷新gridview,以达到显示选中值的效果。

(1)那么如何实现将选中的值保存到datatable,因为我们的bindingSource绑定的是一个全局的datatable,所以只要获取到选中值,很容易就能给datatable赋值,到这里容易被难住,因为我们不能像对待其他控件一样,在他的属性中找到他的某某事件,双击进入代码编写,我们找不到查看repositoryItemComboBox1的属性界面。那就另寻道路,利用委托,于是,我们在之前的 BindDataSource() 方法中,加入一个委托方法, BindDataSource() 代码变为:

private void BindDataSource()
    {
      //1.为repositoryItemComboBox1绑定数据
      for (int i = 0; i < 3; i++)
      {
        CboItemEntity item = new CboItemEntity();
        item.Text = "这是" + i;
        item.Value = i;
        repositoryItemComboBox1.Items.Add(item);
      }
      //2.为bindingSource绑定一个datatable
      dt = InitDt();
      bindingSource1.DataSource = dt;
      //3.下拉框选中值改变事件
      repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged);
    }

上述代码3( 3. 下拉框 选中值改变事件 )中,ComboBoxEdit_SelectedIndexChanged 的代码如下:

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 =(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, "提示");
      }
    }

(2)完成到这里,先不要急着运行,因为当运行的时候,又会有一个新的问题,选中的值会保存到datatable,但是gridview的单元格不答应,提示对象必须实现Iconvertible:

解决办法是,继续在 BindDataSource() 中添加一个委托方法解决它,BindDataSource() 代码变为:

private void BindDataSource()
    {
      //1.为repositoryItemComboBox1绑定数据
      for (int i = 0; i < 3; i++)
      {
        CboItemEntity item = new CboItemEntity();
        item.Text = "这是" + i;
        item.Value = 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);
    }

在上述代码4( 4 .解决IConvertible问题 )中,repositoryItemComboBox1_ParseEditValue 的代码如下:

void repositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e)
        {
            e.Value = e.Value.ToString(); e.Handled = true;
        } 

到这里,就已全部完成咯,效果图:

至于如果后续要做什么数据处理,比如保存到数据库什么的,怎么获取选择的实际值显示值什么的,在全局的datatable中不是已经保存好了嘛。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
php中使用exec,system等函数调用系统命令
php的内置函数exec,system都可以调用系统命令(shell命令),当然还有passthru,escapeshellcmd等函数。   在很多时候利用php的exec,system等函数调用系统命令可以帮助我们更好更快的完成工作。
682 0
Android EventBus 3.0.0 使用总结
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/53065112 本文出自【赵彦军的博客】 前言 EventBus框架 EventBus是一个通用的叫法,例如Google出品的Guava,Guava是一个庞大的库,EventBus只是它附带的一个小功能,因此实际项目中使用并不多。
961 0
AliOS Things 使用HAL库的USB_DEVICE MSC调用SPI W25Q128
AliOS Things的USB_DEVICE MSC的SPI W25Q128实现
857 0
iOS获取和监测设备基本信息——UIDevice的使用
iOS获取和监测设备基本信息——UIDevice的使用
25 0
对小程序地图小程序API:my.createMapContext(mapId)的简单使用
my.createMapContext(mapId):创建并返回 map 上下文 mapContext 对象。 mapContext 通过 mapId 跟一个  组件绑定,通过它可以操作对应的  组件。
1548 0
QGraphicsItem如何使用信号/槽
简述 对于 QGraphicsItem 来说,信号/槽和属性机制不是它的一部分,因为它不继承自 QObject。这是一个出于性能考虑的设计决策,允许比较大的场景以及快速的交互。 特殊情况下,如果真的需要使用信号/槽,可以使用 QObject 的信号/槽和属性机制来扩展 QGraphicsItem。 简述 继承自 QObject 和 QGraphicsItem 继承
1391 0
由Google搜索页引发对box-shadow的使用和技巧总结
CSS3的box-shadow有点类似于text-shadow,只不过不同的是text-shadow是对象的文本设置阴影,而box-shadow是给对象实现图层阴影效果。(本文我们搁下IE不谈,只谈谈box-shadow的具体使用方法)
1237 0
+关注
726
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载