惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
罗磊的独立博客
SecWiki News
SecWiki News
The Register - Security
The Register - Security
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Schneier on Security
IT之家
IT之家
博客园 - 聂微东
T
The Exploit Database - CXSecurity.com
Recorded Future
Recorded Future
大猫的无限游戏
大猫的无限游戏
Know Your Adversary
Know Your Adversary
Latest news
Latest news
Vercel News
Vercel News
G
GRAHAM CLULEY
D
DataBreaches.Net
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
博客园_首页
雷峰网
雷峰网
T
Tenable Blog
Spread Privacy
Spread Privacy
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
Cisco Talos Blog
Cisco Talos Blog
V
Visual Studio Blog
J
Java Code Geeks
博客园 - Franky
The Cloudflare Blog
Apple Machine Learning Research
Apple Machine Learning Research
C
CERT Recently Published Vulnerability Notes
T
Threatpost
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
P
Privacy International News Feed
T
Threat Research - Cisco Blogs
T
The Blog of Author Tim Ferriss
V
Vulnerabilities – Threatpost
Recent Announcements
Recent Announcements
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
U
Unit 42
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
B
Blog
腾讯CDC

博客园 - zoop89850

maven 打包 时出现非法字符: /65279错误 JAVA学习笔记 第一篇 开发环境 传输文件过程中遇到异常被中断 项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序的解决办法[转] 窗体的置顶显示 WPF Image控件中的ImageSource与Bitmap的互相转换 WPF加载相对路径的图片的解决方法 2011/08/27 刷机器,遭遇白苹果,不可连接ipod服务器 的解决 将截图图片放入内存(剪贴板)中 C# 获取屏幕的大小 转载:MicrosoftHelp文件夹中后缀名为.hxw .hxm之类的文件是MSDN帮助文档的索引,不要轻易删除 利用case或者decode实现自定义顺序排序 【摘】枚举类型 一种简单的根据备份文件 恢复数据库的方法 计算sql语句的执行时间 Java,JavaScript,JScript 区别 HTML代码简单教程 文件夹无法打开怎么办? - zoop89850 - 博客园 sqlserver提示“在流水模式下,事务无法启动”的解决办法
C# WinForm急速系列 – DataGridView 附Word文档
zoop89850 · 2011-07-29 · via 博客园 - zoop89850

C# WinForm急速系列 – DataGridView

 2011/07/28 zp

上传了相应的word文档,图片看不见的话,下载文档吧,记得打开前杀毒,虽然我的机器上也有杀毒软件

CsharpWinForm急速系列-DataGridView.rar

 

一.创建一个最简单的dataGridView

二.datagridview 控件左侧的固定列能显示出序号

三、在上面的状态中消除固定列的行指示器

四.鼠标点击时,点亮整行

五、固定表头的定义

六.DataGridView提供的添加、编辑、删除、排序功能

增加行号固定列与其他列的显示模式修正

八、一个诡异的问题:设置成FullRowSelect后连击时,焦点会进入单元格

九、根据DataGridView点击的位置显示不同的右键菜单

十、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后连击时,焦点会进入单元格

DataGridViewSelectionMode属性设置成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

运行效果: