.net WinForm用户控件开发--(2)带按钮DataGridView
这一节大家共同学习下自定义的datagridview, 这个datagridview的主要功能是可以使datagridview中的某些列包含按钮,单击按钮可以触发相应的事件。
我们先来看下效果图吧!
下面我们来说下实现步骤
1.创建自定义控件
创建一个自定义控件,添加新项---自定义控件
2.实现自定义datagridview控件
使刚创建的自定义控件继承datagridview,然后在自定义控件中拖放一个button按钮,然后在datagridview中的单元格获得焦点的时候,使当前单元格在当前单元格的右侧显示一个按钮.
代码如下:
[csharp]
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);
}
}
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指定的列显示按钮,当单击按钮的时候弹出一个对话框,
输入内容,将输入的内容重新赋值给当前单元格。
效果图:
代码:
[csharp]
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;
}
}
}
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;
}
}
}
作者:zx13525079024
上一篇: C语言实现之运动员跳水名次问题
下一篇: python自动化运维、IPy包
推荐阅读
-
.net WinForm用户控件开发--(7)用户控件下拉式属性设置
-
.net WinForm用户控件开发--(5)用户控件复杂属性设置
-
.net WinForm用户控件开发--(1)带按钮的textbox控件
-
.net WinForm用户控件开发--(3)可多选的下拉列表框
-
.net WinForm用户控件开发--(2)带按钮DataGridView
-
.net WinForm用户控件开发--(5)用户控件复杂属性设置
-
.net WinForm用户控件开发--(7)用户控件下拉式属性设置
-
.net WinForm用户控件开发--(1)带按钮的textbox控件
-
.net WinForm用户控件开发--(3)可多选的下拉列表框
-
.net WinForm用户控件开发--(2)带按钮DataGridView