zoukankan      html  css  js  c++  java
  • 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

    运行效果:


     

  • 相关阅读:
    Modelsim SE 问题集锦【原创】
    Android Fastboot
    sd_fusing总结
    Quartus II 文件类型及备份【原创】
    GNU ARM汇编的.balignl对齐实验
    uboot_smdkv210 分析一:源码目录结构
    怎样理解阻抗匹配【转】
    单文件上传与微信多媒体文件转码
    获取微信签名
    Linux 环境下svn 服务器搭建
  • 原文地址:https://www.cnblogs.com/zp89850/p/2121102.html
Copyright © 2011-2022 走看看