• 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问题



  • 相关阅读:
    洛谷 P1781 宇宙总统
    洛谷 P2524 Uim的情人节礼物·其之弐(康拓展开)
    洛谷 P1123 取数游戏
    洛谷 P4147 玉蟾宫 & P1169 [ZJOI2007]棋盘制作(求最大子矩阵)
    洛谷 P1387 最大正方形 & P2701 [USACO5.3]巨大的牛棚Big Barn (求最大子正方形)
    洛谷 P1464 Function
    洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
    洛谷 P1160 队列安排
    洛谷 P1451 求细胞数量
    洛谷 P1914 小书童——密码
  • 原文地址:https://www.cnblogs.com/Sherlock-J/p/12925998.html
Copyright © 2020-2023  润新知