C# WinForm急速系列 – DataGridView
2011/07/28 zp
上传了相应的word文档,图片看不见的话,下载文档吧,记得打开前杀毒,虽然我的机器上也有杀毒软件
六.DataGridView提供的添加、编辑、删除、排序功能
八、一个诡异的问题:设置成FullRowSelect后连击时,焦点会进入单元格
九、根据DataGridView点击的位置显示不同的右键菜单
十一、winfrom 中 datagridview焦点行随滚轮滚动变化上下移动
一.创建一个最简单的dataGridView
① 拖进一个button 命名为btnLoadData
② 拖进一个 dataGridView 命名为dgvUser,设置属性。
③ 双击按钮,在其btnLoadData_Click点击事件中添加代码:
//查找到数据,此处无关大局,就不详细解说。:)
DataTable dtUser = SelectUser();
//最简单的方法就是自动创建列
dgvUser.AutoGenerateColumns = true;
dgvUser.DataSource = dtUser;
④ 此时的运行效果是:
二.datagridview 控件左侧的固定列能显示出序号
① 增加事件dgvUsers_RowPostPaint
② 在事件中添加代码
//增加行号
if (e.RowIndex >= dgvUsers.FirstDisplayedScrollingRowIndex)
{
using (SolidBrush b = new SolidBrush(dgvUsers.RowHeadersDefaultCellStyle.ForeColor))
{
int linen = 0;
linen = e.RowIndex + 1;
string line = linen.ToString();
//第四个参数是指行号的左上角的横坐标,2* line.Length是指行号的长度的一半(像素)
e.Graphics.DrawString(line, e.InheritedRowStyle.Font, b,
e.RowBounds.Location.X + this.dgvUsers.RowHeadersWidth / 2 - 2 * line.Length + 2,
e.RowBounds.Location.Y + 4);
SolidBrush B = new SolidBrush(Color.Red);
}
}
③运行效果:
三、在上面的状态中消除固定列的行指示器
① 在dgvUsers_RowPostPaint中增加代码(一定要将下面的代码在增加固定列的行号之前,否则,你试试):
//取消行指示器(即那个向右的箭头),先画背景,再画序号
Rectangle rowHeaderBounds = new Rectangle(2, e.RowBounds.Top, this.dgvUsers.RowHeadersWidth - 2, e.RowBounds.Height - 1);
using (Brush backbrush = new SolidBrush(SystemColors.Control))
{
e.Graphics.FillRectangle(backbrush, rowHeaderBounds);
}
② 运行效果:
四.鼠标点击时,点亮整行
① 设置属性SelectionMode 为FullRowSelect可以点亮正行
② 设置属性SelectionMode 也可以可以点亮正列(当SelectionMode设置为FullColumnSelect时,列SortMode 不能设置为 Automatic)
五、固定表头的定义
① 在DataGridView控件的右上角的小三角à编辑列à添加,如下图:
其中的名称表示你给此列定义的名称,你可以根据dgvUsers.Columns["UserName"]定位到某一列。
页眉文本(也就是列名) = dgvUsers.Columns["UserName"].HeaderText
② 参数设定
AutoSizeMode 确定此列自动调整大小的模式,比如是只根据列头还是根据此列中最长的单元格就是固定列宽。
DataPropertyName是我给此列绑定的datatable中的列名,
HeaderText,列名,鬼都知道。
经常用的还有个Visible属性
六.DataGridView提供的添加、编辑、删除、排序功能。
个人认为,除了重新排序,其余的都是鸡肋,或者说没有用好那是相当的鸡肋,
合法性判断等可是不咋好加啊。承认自己现在还差点道行,等哪天看看吧。
七 增加行号/ 固定列与其他列的显示模式修正
使用消除固定列的行指示器和在固定列添加行号,
/// <summary>
/// datagridview 控件左侧的固定列能显示出序号 就是行指示器(即那个向右的箭头)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvUsers_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
//取消行指示器(即那个向右的箭头), 先画背景,再画序号
Rectangle rowHeaderBounds = new Rectangle(2, e.RowBounds.Top, this.dgvUsers.RowHeadersWidth - 2, e.RowBounds.Height - 1);
using (Brush backbrush = new SolidBrush(dgvUsers.DefaultCellStyle.BackColor))
{
e.Graphics.FillRectangle(backbrush, rowHeaderBounds);
}
//增加行号
if (e.RowIndex >= dgvUsers.FirstDisplayedScrollingRowIndex)
{
using (SolidBrush b = new SolidBrush(dgvUsers.RowHeadersDefaultCellStyle.ForeColor))
{
int linen = 0;
linen = e.RowIndex + 1;
string line = linen.ToString();
//第四个参数是指行号的左上角的横坐标,4* line.Length是指行号的长度(像素)
e.Graphics.DrawString(line, e.InheritedRowStyle.Font, b, e.RowBounds.Location.X + this.dgvUsers.RowHeadersWidth / 2 - 4 * line.Length + 2, e.RowBounds.Location.Y + 4);
SolidBrush B = new SolidBrush(Color.Red);
}
}
}
效果如下
可以发现行的首列跟其他列的格式非常不同。
在上述基础上
① 将固定列隐藏,
② 增加一列No名为的列,
③ 不给No列绑定数据。
那么为固定列添加的行号会添加到No列。
风险:①当行超过6位数值后,此列的长度不足以显示行号
② No列的格式仍与其他列不同
时间到了19:11,在遍历了整个DataGridView能触发的事件后,一个闪着金光的字符冲入我的耳朵。
就是她了。
写代码,测试,通过,效果如下:
重新排序后,No号码也是不会打乱。
好了解决了,再见!!
dgvUsers_DataBindingComplete + dgvUsers.Rows[i].Cells["No"].Value
八、一个诡异的问题:设置成FullRowSelect后连击时,焦点会进入单元格
将DataGridView的SelectionMode属性设置成FullRowSelect后,无论鼠标单击双击,都应当显示选中正行。
但是我的程序中,在频繁连击时,焦点会进入某一个单元格,如下图:
实在没办法了,在新建的工程中也创建了同样的DataGridView,在连续点击鼠标时,也没有出现焦点进入单元格的事件,如是,怀疑自己的程序的代码中肯定有更改了某一属性。将跟DataGridView相关的代码逐次注释,结果发现是代码中有一句DataGridView1.ReadOnly = false ;惹得祸。将此句删除后,问题解决。
九、根据DataGridView点击的位置显示不同的右键菜单
/// <summary>
/// 鼠标按键落下时的事件
/// </summary>
private void datagridview1_MouseDown(object sender, MouseEventArgs e)
{
//在给定了 x 坐标和 y 坐标的情况下返回位置信息,例如,行索引和列索引。
int r = this.dgvUsers.HitTest(e.X, e.Y).RowIndex; //行
//鼠标点击的位置在有效范围内, 显示用户的详细信息
if (r >= 0 && r < dgvUsers.Rows.Count)
{
datagridview1.ClearSelection();
datagridview1.Rows[r].Selected = true;
//datagridview1.CurrentCell = datagridview1.Rows[r].Cells[-1];//重新设定datagridview的活动状态单元格
}
if (r >= 0 && r < datagridview1.Rows.Count && e.Button == MouseButtons.Right)//鼠标右键点击的位置在有效范围内,显示全部的右键菜单
{
contextMenuStripUser.Items.Clear();//清空右键菜单
contextMenuStripUser.Items.Add(toolStripMenuItemAddUser);//添加用户
contextMenuStripUser.Items.Add(toolStripMenuItemEditUser);//修改
contextMenuStripUser.Items.Add(toolStripMenuItemResetPwd);//重置密码
contextMenuStripUser.Items.Add(toolStripMenuItemDeleteUser);//删除用户
contextMenuStripUser.Items.Add(toolStripMenuItemShowOnline);//显示在线用户
datagridview1.ContextMenuStrip = contextMenuStripUser;//给datagridview1绑定右键菜单
datagridview1.ContextMenuStrip.Show(datagridview1, e.X, e.Y);//设置右键菜单的显示位置
}
else if (e.Button == MouseButtons.Right)//鼠标右键点击的位置不在有效范围内,右键菜单只显示“添加用户”
{
contextMenuStripUser.Items.Clear();
contextMenuStripUser.Items.Add(toolStripMenuItemAddUser);
contextMenuStripUser.Items.Add(toolStripMenuItemShowOnline);
datagridview1.ContextMenuStrip = contextMenuStripUser;
datagridview1.ContextMenuStrip.Show(datagridview1, e.X, e.Y);
}
}
十、DataGridView常用属性
只读属性设定
datagridview.ReadOnly = True
行自动追加
datagridview.AllowUserToAddRows = False
删除行允许
datagridview.AllowUserToDeleteRows = False
行幅设置
datagridview.AllowUserToResizeRows = False
datagridview.ColumnHeadersHeightSizeMode =DataGridViewColumnHeadersHeightSizeMode.DisableResizing
datagridview.RowTemplete.Resizable = false //生成的行的行高不能被修改
datagridview.RowHeaderHeightSizeMode = EnableResizing
datagridview.ColumnHeaderHeightSizeMode = EnableResizing
datagridview.RowHeaderHeightSizeMode = EnableResizing
datagridview.Columns[“No”].Resizable = True允许修改列宽
行表示
datagridview.RowHeadersVisible = False
行选择模式
datagridview.SelectionMode = DataGridViewSelectionMode.FullRowSelect
复数行选择
datagridview.MultiSelect = True
选择状态解除
datagridview.ClearSelection()
文字设置位置
datagridview.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
datagridview.RowHeaderDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
datagridview. DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
datagridview.RowTemplete. DefaultCellStyle = DataGridViewContentAlignment.TopLeft
选择后行的颜色
datagridview.DefaultCellStyle.SelectionBackColor = Color.GreenYellow
datagridview.DefaultCellStyle.SelectionForeColor = Color.Black
行幅自动调整
datagridview.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
DataGridViewCellStyle { BackColor=Color [MediumAquamarine], ForeColor=Color [ControlText], SelectionBackColor=Color [InactiveCaption], SelectionForeColor=Color [HotTrack], Font=[Font: Name=宋体, Size=9, Units=3, GdiCharSet=134, GdiVerticalFont=False], WrapMode=True, Alignment=MiddleLeft }
十一、winfrom 中 datagridview焦点行随滚轮滚动变化上下移动 怎么做呀
使用scroll事件,改变CurrentCell的值
十二、隔行显示不同的模式/奇数行的单元格样式设定
通过下面的属性设置背景色和文字颜色。
AlternatingRowDefaultCellStyle.BackColor/ForColor 背景色和文字色
AlternatingRowDefaultCellStyle.SelectionBackColor/SelectionForColor 选中后的背景色和文字色
X此处选中模式不定义,会调用DefaultCellStyle.SelectionBackColor/SelectionForColor的设定
AlternatingRowDefaultCellStyle: DefaultCellStyle:
通过下面的属性设置成只显示横线,不显示竖线的格式
DatagridView.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal
运行效果: