GridView下拉键值选择框

1、添加下拉框列(这个是DEV控件的添加)

在Grid Designer中,添加一列,在这列的ColumnEdit熟悉中,可以选择这列的编辑样式,比如让这列是一个按钮或者选择框等等,这里我们选择下拉框,如图:

DevExpress Gridview repositoryItemComboBox

DevExpress Gridview repositoryItemComboBox
这个下拉框默认被命名为repositoryItemComboBox1,我们对这列的操作,就是对repositoryItemComboBox1的操作。
二、绑定数据
这里就不多做解释。我们假设gridview的数据源是dt。
三、repositoryItemComboBox|下拉框的处理
完成上述的内容,当我们运行程序的时候,会发现,datagridview显示datatable中的值,下拉框有我们绑定的数据,但是当我在下拉框中选 择一个值离开后,gridview不会显示我们选中的值,而是回到原值。我们就要想办法让我们选中一个值时,保存到datatable中,这样当我们离开 后,bindingSource自然会刷新gridview,以达到显示选中值的效果。

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

注:editor就是你的下来框,我这里是自己再次封装后的DEV控件。你没有封装就直接是:repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged);

private void DutyOrgEdit_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                //1.获取下拉框选中值
                var item = (sender as ComboBoxEdit).SelectedItem;
                string id = ((System.Collections.Generic.KeyValuePair<string, string>)(item)).Key;//这里是你要保存到数据库的值。因为前面提到过是封装后的控件,所以我的类型是KeyValuePair,这个要根据你自己的类型来。可以调适进去看看你的类型是什么。
                string name = ((System.Collections.Generic.KeyValuePair<string, string>)(item)).Value;//这里是你显示的值
                //获取选中的行                
                int dataIndex = this.bizGridView1.GridView.GetDataSourceRowIndex(this.bizGridView1.GridView.FocusedRowHandle);
                DataRow info = this.bizGridView1.GridView.GetFocusedDataRow();
                dt.Rows[dataIndex]["OwnLabourSerName"] = name;
                dt.Rows[dataIndex]["DutyCenterID"] = id;
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "提示");
            }
        }

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

解决办法是,给下拉框在增加一个事件:editor.ParseEditValue += new ConvertEditValueEventHandler(DutyOrg_ParseEditValueprivate)

private void DutyOrg_ParseEditValue(object sender, ConvertEditValueEventArgs e)
        {
            //截取一下
            string value = e.Value.ToString();
            if (value.IndexOf(",") >= 0)
                value = value.Substring(value.IndexOf(",") + 1, value.Length - value.IndexOf(",") - 2).Trim();

    //注:红色的这段是我这里的特殊处理,因为这个当前显示的是[id,name]这种形式的,所以我这里必须特殊处理一下。不需要特殊处理直接e.Value = e.Value.ToString();即可
            e.Value = value;
            e.Handled = true;
        });


这里,就已全部完成咯。在告诉一点:如果想下拉框直接鼠标点击就展现下拉(这样用户体验度是不是好一点呢?)

设置下拉框属性:editor.ImmediatePopup = true;并且GridView1的属性OptionsBehavior.EditorShowMode = DevExpress.Utils.EditorShowMode.MouseDown;即可。


有时候我们会清空当前选中的值,在SelectedIndexChanged事件中增加如下代码:

、var com = (sender as ComboBoxEdit);
    com.EditValue = null;

  Function.ShowMsg("提示信息!", CYSoft.Common.CYEnumerate.MsgType.Warning);

但是增加了这段代码后, com.EditValue = null;实际上是会报错的。你翻看上面,我们是把错误信息直接抛出来的,所以要把XtraMessageBox.Show(ex.Message, "提示");这个屏蔽掉。

但是我们看到下拉框还有一个事件ParseEditValue。当我们清空当前选中值的时候,ParseEditValue事件里的e.Value是空的,所以我们也需要改造一下这个事件:

if (e.Value != null)
                e.Value = e.Value.ToString();
            e.Handled = true;

                e.Value = e.Value.ToString();

            e.Handled = true;

。上面这种方法实际是曲线救国,我暂时没找到其他方法,后面找到更好的办法会更新本文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值