DataGridViewは行番号を表示します。

4661 ワード

ref:http://blog.csdn.net/xieyufei/article/details/9769631
 
方法1:
インターネット上で最も一般的なやり方は、DataGridViewのRowPostPaintイベントでRowHeaderCellに行番号を描きます。
 1 private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)  
 2 {  
 3     var grid = sender as DataGridView;  
 4     var rowIdx = (e.RowIndex + 1).ToString();  
 5   
 6     var centerFormat = new StringFormat()   
 7     {   
 8         // right alignment might actually make more sense for numbers  
 9         Alignment = StringAlignment.Center,   
10         LineAlignment = StringAlignment.Center  
11     };  
12   
13     var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);  
14     e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);  
15 }  
しかし、この方法は大きなデータ量では性能が悪く、スクロール毎にRowPostPaintイベントをトリガします。
 
方法二:
私のやり方は各行のHeaderCellに値を付けることです。
ネットでこのようなやり方を言っている人がいますが、最後の表示問題で上記の方法を選択しました。具体的な問題は、行番号が2桁を超えています。例えば、100、1000のように、行を選択した時に、DataGridViewの行のインジケータが選択されます。▶行番号を右に押すと、現実的な不全になります。100の時に表示されます。▶10です
実はまだRowsHeader Widthのサイズに問題があります。列の幅を拡大して、行番号を表示しても大丈夫です。
彼らが試したことがあるかどうかは分かりませんが、上にライン番号を書く方法は大きなライン番号で表示されても問題があります。
問題の所在を知っている以上、相応の解決方法を見つけなければならない。
具体的には、Data GridViewのRowsHeader WidthSize Mode属性をAutoSize ToAllHeadersまたはAutoSize ToDispladHeadersに設定しています。このように自動的に幅を設定すると、行のインジケータが押された行番号が現れなくなります。
DataGridViewのたびに、私たちは行番号を更新し、Rows AddedとRows Removedイベントを利用します。
コードは以下の通りです
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)  
       {  
           for (int i = 0; i < e.RowCount; i++)  
           {  
               dataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
               dataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();  
           }  
           for (int i = e.RowIndex + e.RowCount; i < this.dataGridView1.Rows.Count; i++)  
           {  
               dataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
               dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();  
           }  
       } 

private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)  
        {  
            for (int i = 0; i < e.RowCount; i++)  
            {  
                dataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
                dataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();  
            }  
  
            for (int i = e.RowIndex + e.RowCount; i < this.dataGridView1.Rows.Count; i++)  
            {  
                dataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
                dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();  
            }  
        }   
 
方法三:
ReadOnlyのDisplayには、より簡便な方法があります。
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)  
       {  
           e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);  
       }