Winfrom中DataGridView的ComboBox功能实现(Gridview下拉框)

本文主要参考:https://www.evget.com/article/2014/10/11/21674.html

查了不少资料,只有这个算给力,可是问题在于这篇文章是教程,也就是说阅读的时候逐步推导实在是有些繁琐,所以我再重新整理一遍,以供参考。

本文想要实现的效果如下:

 

 

也就是图中的最后一列。并且有显示文本DisplayText 以及实际值 Value 进行一一对应。和一个实际的 ComboBox 控件所要实现的功能一模一样。

 

一、绑定前准备

 

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


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


DevExpress 》 Gridview 》repositoryItemComboBox

这个下拉框默认被命名为repositoryItemComboBox1,我们对这列的操作,就是对repositoryItemComboBox1的操作。

 

二、代码

1.repositoryItemComboBox 所绑定的是一个对象集,这里为了简易说明,所以对象只有两个属性,显示值 Text 与实际值 Value 。
                public class ComboxData
    		{

		        public string Text { set; get; }

		        public string Value { set; get; }

		        public override string ToString()
		        {

		            return Text;

		        }

    		}

2.为 RepositoryItemComboBox 绑定一个datatable中的两列,实际工作中,可以是从数据库中获取一张表等以指定特定列来构成绑定对象
        /// <summary>
        /// 绑定RepositoryItemComboBox 值
        /// </summary>
        /// <param name="combox"></param>
        /// <param name="dt"></param>
        /// <param name="File_name"></param>
        /// <param name="File_code"></param>
        public static void RepositoryItemComboBoxDateBinding(RepositoryItemComboBox combox, DataTable dt, string File_name, string File_code)
        {

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                ComboxData data = new ComboxData();
                data.Text = dt.Rows[i][File_name].ToString().Trim();
                data.Value = dt.Rows[i][File_code].ToString().Trim();

                combox.Items.Add(data);
            }
        }

3.这段代码需要结合来看,并且需要仔细想想,看重点
        /// <summary>
        /// *创建注释*
        ///  创建描述:下拉框选中值改变事件
        ///  日    期:2017.8.2 15:0
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void ComboBoxEdit_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboxData item = new ComboxData();
            try
            {
                //1.获取下拉框选中值
                item = (ComboxData)(sender as ComboBoxEdit).SelectedItem;
                string Text = item.Text.ToString();
                string Value = item.Value.ToString();
                //2.获取gridview选中的行
                GridView myView = (gridControl1.MainView as GridView);
                int dataIndex = myView.GetDataSourceRowIndex(myView.FocusedRowHandle);
                //3.保存选中值到datatable(重点)
                DataTable dt = (DataTable)this.gridControl1.DataSource;
                dt.Rows[dataIndex]["DIS"] = Text;   		//显示值
                dt.Rows[dataIndex]["VALUE"] = Value;		//实际值
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "提示");
            }
        }
重点在于3小节 保存选中值到datatable,为什么有这么一项操作,因为 RepositoryItemComboBox 下拉框的实现是用 DataTable 中的两列来实现的。
下拉框并不是只在一列完成其功能,它需要一列来存储显示值,另一列来存储实际值。
当然,实际值的前台显示视具体情况而定,大多数是隐藏的。

4.选中的值会保存到datatable,但是gridview的单元格不答应,提示对象必须实现Iconvertible
        /// <summary>
        /// *创建注释*
        ///  创建描述:解决IConvertible问题
        ///  日    期:2017.8.2 15:16
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void repositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e)
        {
            try
            {
                e.Value = e.Value.ToString();
            }
            catch (Exception Ex)
            {
                e = new ConvertEditValueEventArgs();
                e.Value = "";
            }

            e.Handled = true;
        }

5.当然了,委托方法写好了得添加进去
this.repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged2);                //下拉框选中值改变事件
this.repositoryItemComboBox1.ParseEditValue += new ConvertEditValueEventHandler(repositoryItemComboBox1_ParseEditValue); //解决IConvertible问题



posted @ 2017-08-28 23:28  夏洛克卷  阅读(481)  评论(0编辑  收藏  举报