.net WinForm用户控件开发--(2)带按钮DataGridView

    这一节大家共同学习下自定义的datagridview, 这个datagridview的主要功能是可以使datagridview中的某些列包含按钮,单击按钮可以触发相应的事件。

我们先来看下效果图吧!

  

下面我们来说下实现步骤

  1.创建自定义控件

    创建一个自定义控件,添加新项---自定义控件

 

2.实现自定义datagridview控件

  使刚创建的自定义控件继承datagridview,然后在自定义控件中拖放一个button按钮,然后在datagridview中的单元格获得焦点的时候,使当前单元格在当前单元格的右侧显示一个按钮.

  代码如下:

  

  public partial class DataGridViewButton : DataGridView
    {
        private Array _ShowButtonColumns;   //有按钮的列名称

        /// <summary>
        /// 设置要显示按钮的列
        /// </summary>
        /// <param name="ShowButtonColumns"></param>
        public void SetParam(Array ShowButtonColumns)
        {
            _ShowButtonColumns = ShowButtonColumns;
        }

        public DataGridViewButton()
        {
            InitializeComponent();
            this.Controls.Add(button1);
        }

        /// <summary>
        /// 数组中是否有与指定值相等的元素
        /// </summary>
        /// <param name="columnName"></param>
        /// <param name="ShowButtonColumns"></param>
        /// <returns></returns>
        private bool IsShowButtonColumn(string columnName, Array ShowButtonColumns)
        {
            if (string.IsNullOrEmpty(columnName) || ShowButtonColumns == null || ShowButtonColumns.Length < 1) return false;

            foreach (string astr in ShowButtonColumns)
                if (astr == columnName) return true;

            return false;
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

        private void DataGridViewButton_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (IsShowButtonColumn(this.Columns[this.CurrentCell.ColumnIndex].Name, _ShowButtonColumns))
            {

                Point p = new Point();

                if (this.button1.Height != this.Rows[this.CurrentCell.RowIndex].Height)
                {
                    this.button1.Height = this.Rows[this.CurrentCell.RowIndex].Height;
                }
                #region 获取X轴的位置


                if (this.RowHeadersVisible)
                {
                    //判断该类是否包含行标题,如果该列包含行标题,按钮的横坐标位置等于当前位置加上行标题
                    p.X += this.RowHeadersWidth;
                }
                //FirstDisplayedCell表示左上角第一个单元格
                for (int i = this.FirstDisplayedCell.ColumnIndex; i <= this.CurrentCell.ColumnIndex; i++)
                {
                    if (this.Columns[i].Visible)
                    {
                        //当前位置=单元格的宽度加上分隔符发宽度
                        p.X += this.Columns[i].Width + this.Columns[i].DividerWidth;
                    }
                }

                p.X -= this.FirstDisplayedScrollingColumnHiddenWidth;
                p.X -= this.button1.Width;
                #endregion

                #region 获取Y轴位置

                if (this.ColumnHeadersVisible)
                {
                    //如果列表题可见,按钮的初始纵坐标位置等于当前位置加上列标题
                    p.Y += this.ColumnHeadersHeight;
                }

                //获取或设置某一列的索引,该列是显示在 DataGridView 上的第一列
                for (int i = this.FirstDisplayedScrollingRowIndex; i < this.CurrentCell.RowIndex; i++)
                {
                    if (this.Rows[i].Visible)
                    {
                        p.Y += this.Rows[i].Height + this.Rows[i].DividerHeight;
                    }
                }

                #endregion

                this.button1.Location = p;
                this.button1.Visible = true;
            }
            else
            {
                this.button1.Visible = false;
            }
        }

        private void DataGridViewButton_Scroll(object sender, ScrollEventArgs e)
        {
            this.button1.Visible = false;
        }

        //定义按钮的单击事件
        public delegate void ButtonClick();
        public event ButtonClick ButtonSelectClick;

        private void button1_Click(object sender, EventArgs e)
        {
            this.ButtonSelectClick.DynamicInvoke(null);
        }
    }


3.编辑该控件,将控件拖放到窗体

   现在编译该控件,然后从工具箱中将该控件拖放到窗体上,然后绑定datagridview,设置datagridview指定的列显示按钮,当单击按钮的时候弹出一个对话框,

输入内容,将输入的内容重新赋值给当前单元格。

  效果图:

   

 

  代码:

 

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            DataColumn dc1 = new DataColumn("weibo", typeof(System.String));
            dt.Columns.Add(dc1);

            DataColumn dc2 = new DataColumn("mail", typeof(System.String));
            dt.Columns.Add(dc2);

            DataColumn dc3 = new DataColumn("blog", typeof(System.String));
            dt.Columns.Add(dc3);

            for (int i = 0; i < 50; i++)
            {
                DataRow dr = dt.NewRow();
                dr[0] = "下里巴人simple";
                dr[1] = "524300045@qq.com";
                dr[2] = "msdn" + i.ToString();
                dt.Rows.Add(dr);
            }
            //设置要显示按钮的单元列
            string[] showcell = { "weibo", "mail" };
            this.dataGridViewButton1.SetParam(showcell);
            this.dataGridViewButton1.DataSource = dt;
        }

        private void dataGridViewButton1_ButtonSelectClick()
        {
            Form2 f2 = new Form2();
            if (f2.ShowDialog()==DialogResult.OK)
            {
                this.dataGridViewButton1.CurrentCell.Value = f2.ReturnText;
            }
        }
    }


demo下载:http://download.csdn.net/detail/zx13525079024/4445919

 

关于datagridview的属性说明MSDN:http://msdn.microsoft.com/zh-cn/library/wc5cbb9z(v=vs.80)

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值