• 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();
                }
            }

    复制代码

  • 相关阅读:
    [算法][求积分][复合辛普森公式]
    [51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]
    [51单片机] SPI nRF24L01 无线简单程序 1
    [stm32] 利用uC-BmpCvt软件生成uc-gui可调用的bmp图片
    [stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
    [stm32] 中断
    [C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中
    [游戏学习28] MFC 时钟
    [游戏学习27] MFC 匀速运动
    [游戏学习26] MFC 时间函数 画图形
  • 原文地址:https://www.cnblogs.com/grj001/p/12225638.html
Copyright © 2020-2023  润新知