C# WinForm急速系列 – DataGridView 附Word文档

C# WinForm急速系列 – DataGridView

 2011/07/28 zp

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

 

 

一.创建一个最简单的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

运行效果:


 

原文地址:https://www.cnblogs.com/zp89850/p/2121102.html