读书人

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

发布时间: 2012-07-28 12:25:13 作者: rapoo

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

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

我们先来看下效果图吧!

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

下面我们来说下实现步骤

1.创建自定义控件

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

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

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指定的列显示按钮,当单击按钮的时候弹出一个对话框,

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

效果图:

.net WinForm用户控件开发-(二)带按钮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)

读书人网 >编程

热点推荐