zoukankan      html  css  js  c++  java
  • C# DataGridView:为行头添加行号

    C# DataGridView:为行头添加行号

     最终解决方法

            private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
    
                //for (int i = 0; i < e.RowCount; i++)
                //{
                //    dataGridView1.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
                //}
                for(int i = 0;i<dataGridView1.Rows.Count;i++)
                {
                    dataGridView1.Rows[i].HeaderCell.Value = (i+1).ToString();
                }
            }
    

    查找到的资料是通过DataGridView的RowPostPaint事件中进行绘制完成。

    http://www.cnblogs.com/basicapp/archive/2006/10/07/522851.html

    本人对控件绘制不了解,且有评论认为效率不高,所以通过DataGridViewRow.HeaderCell对像来对行头进行操作。

    首先了解如何对HeaderCell进行赋值

    以下代码,来自MSDN 

    (需要注意的是Value接收的是string对象。我开始直接将整形 1 赋值给Value,并将DataGridViewRow.HeaderCell.ValueType设置为Int时,value不显示。)

    复制代码

    private void Button6_Click(object sender, System.EventArgs e)
    {
    
        int rowNumber = 1;
        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            if (row.IsNewRow) continue;
            row.HeaderCell.Value = "Row " + rowNumber;
            rowNumber = rowNumber + 1;
        }
        dataGridView.AutoResizeRowHeadersWidth(
            DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
    }

    复制代码

    第二步何时对HeaderCell进行赋值

    复制代码

         private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if(e.ColumnIndex <=0)
                {
                    dataGridView1.Rows[e.RowIndex].HeaderCell.Value =(e.RowIndex + 1).ToString();
                    
                }
            }

    复制代码

    我选择了在格式转化的时候对行号进行赋值

    但是有两个缺陷

    1.HearderCell 本身不会激活该消息,依靠的是同行第一列单元格。

    2.每当其他单元格的内容改变时,或者重新绘制时,该消息总会响应。

    从目前的使用来看这两种情况不会对最终效果有负面影响。

    但是我想消除这种缺陷。希望在添加行的时候对HeaderCell进行赋值。

    在不同情况下有分别有各种的消息达到这一目的:

    DataGridView.UserAddedRow Event

    用户添加行,情况比较简单,直接对HeadCell进行赋值

    private void dataGridView1_UserAddedRow(object sender, DataGridViewRowEventArgs e)
    {
        e.Row.HeaderCell.Value = (e.Row.Index + 1).ToString();
    }

    DataGridView.RowsAdded Event

    在程序中添加行的时候情况分为两种

    一种是绑定数据以后控件自动添加行(这种情况 DataGridView.RowsAdded ,无法显示正确显示行号)

    事实上通过每次添加行后,全部更新一遍行号,而不依赖e.RowIndex,行号也是可以正确显示的。只是复杂度从常数变成了N。

    一种是通过DataGridView.Rows.Add()添加行,因为此方法总是在最后一样添加新的一行或者多行,所以可以通过以下代码可以成功添加行号

    复制代码

            private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
    
                for (int i = 0; i < e.RowCount; i++)
                {
                    dataGridView1.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
                }
               
            }    

    复制代码

    但是如果使用DataGridView.Rows.Insert()添加行时,以上方法不可行,因为已添加行的行号发生了改变,需要重新更改所有的行头。

    复制代码

            private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
    
                //for (int i = 0; i < e.RowCount; i++)
                //{
                //    dataGridView1.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
                //}
                for(int i = 0;i<dataGridView1.Rows.Count;i++)
                {
                    dataGridView1.Rows[i].HeaderCell.Value = (i).ToString();
                }
            }

    复制代码

  • 相关阅读:
    RFID亮灯电子标签在仓储管理中的应用
    漫画:寻找股票买入卖出的最佳时机(动态规划)
    JAVA深入解析-36个话题-Two
    一行代码让训练速度提升2倍,飞桨自动混合精度技术详解
    追源码的平凡之路
    看完这篇,你也是字符编码大神!
    微服务的熔断原理与实现
    经典论文复现 | PyraNet:基于特征金字塔网络的人体姿态估计
    一文看懂人机对话
    「Spring Boot 2.4 新特性」一键构建Docker镜像
  • 原文地址:https://www.cnblogs.com/grj001/p/12225638.html
Copyright © 2011-2022 走看看