如何对 DataGridView 的行进行编号

本文关键字:编号 DataGridView | 更新日期: 2023-09-27 18:19:37

如何对datagridView的行进行编号?当我添加额外的行时,数字增量?

如何对 DataGridView 的行进行编号

而是使用 datagridview 的 RowPostPaint 事件

void GridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
   this.GridView.Rows[e.RowIndex].Cells[0].Value 
    = (e.RowIndex + 1).ToString();
}

将我的数据源加载到 gridview 后,我在 OnPageLoad 中所做的是使用一个简单的循环在 RowHeaderCell 中设置一个值:

for (int i = 0; i < SensorGridView.Rows.Count; i++)
{
   DataGridViewRowHeaderCell cell = SensorGridView.Rows[i].HeaderCell;
   cell.Value = (i + 1).ToString();
      SensorGridView.Rows[i].HeaderCell = cell;
}

我尝试了上述方法,在OnRowPostPaint和OnCellPostPaint中都没有循环,它们的结果是相似的行号。

干杯

您应该

AutoIncrement列添加到DataTable 中。我假设您有一个实例dataTable DataTable.

//your code that populates the dataTable 
 DataColumn col1 = new DataColumn();
 col1.ColumnName  = "SrNo";
 col1.AutoIncrement = true;
 col1.AutoIncrementSeed = 1;
 col1.AutoIncrementStep = 1;
 dataTable.Columns.Add(col1);
 for(int i=0;i<dataTable.Rows.Count;i++)
  {
    dataTable.Rows[i]["SrNo"] = i + 1;
  }
 dataGridView1.DataSource = dataTable;
//You can also use below code
this.DataGridView1.Rows[e.RowIndex].Cell[0].value =e.RowIndex + 1;

获取总行数

this.DataGridView1.Rows.Count;

这些解决方案中的大多数都适用于最初添加行号。但是,如果将行号添加到行标题,然后对列重新排序,则它们都将消失。因此,您应该做的是使用 DataGridViewBindingCompleteEventHandler 在数据绑定更改

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        this.dGV.DataBindingComplete += 
            new DataGridViewBindingCompleteEventHandler(this.DataBindingComplete);
    }
    // ...
    private void DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        // Loops through each row in the DataGridView, and adds the
        // row number to the header
        foreach (DataGridViewRow dGVRow in this.dGV.Rows)
        {
            dGVRow.HeaderCell.Value = String.Format("{0}", dGVRow.Index + 1);
        }
        // This resizes the width of the row headers to fit the numbers
        this.dGV.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
    }
}

使用此代码,当您添加行、删除行、对列重新排序等时,行号将保留。

Ali Foroughi 的想法是正确的,我稍微修改了他的答案以使用数据绑定网格视图以及手动构建的网格视图。

将此添加到行添加事件每次添加 1 行或多行时,添加的行都会触发。 e.rowindex 是第一行,e.rowcount 是添加的总行数。

    private void dgv1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        for (int i=0;i<e.RowCount;i++)
        this.dgv1.Rows[e.RowIndex + i].Cells[0].Value = (e.RowIndex +i).ToString();
    }

备注:这假设第一列是您的行号列,将单元格[0]更改为单元格[n],其中n =您作为行号列的任何列

在网格中添加一列标题为"Number"(作为第一列(,并将此代码放在其 OnRowAdd 事件中:

this.DataGridView1.Rows[e.RowIndex].Cells[0].Value = this.DataGridView1.Rows.Count;

您必须手动填充网格,不要绑定它编辑:这确实适用于绑定列表,只要您先绑定它然后构造列表。

如果你想使用 RowPostPaint 事件,正如 Malik Niaz 所建议的那样,你最好将发件人转换为 DataGridView。这样,您可以将代码复制并粘贴到任何 RowPostPaint 事件中,并且无需任何修改即可使用它。

((DataGridView)sender).Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();

但是,通过使用 RowPostPaint 事件,我发现它会产生一些图形问题。对于初学者来说,行号将闪烁,滚动条将消失。如果手动加载 DataGridView 而不是将其绑定到数据源,则应该能够使用 RowsAdd 事件。然后,您可以使用与上述完全相同的代码。

绑定其 DataGridView 的用户的替代方法是创建一个方法来循环访问每一行并对其进行编号。

private void numberMyGrid(DataGridView dgv)
{
    foreach (DataGridViewRow row in dgv.Rows)
    {
        row.HeaderCell.Value = (row.Index + 1).ToString();
    }
}

然后,可以在 DataGridView 中加载数据后调用它。

在网格中添加标题为"行号"的列,并将其转换为模板字段

评估行索引号并将其转换为整数并加一。

或将以下代码复制到数据网格中

               <asp:TemplateField HeaderText="Row Num">     
                    <ItemTemplate>
                        <asp:Label ID="lblRowNum" runat="server" Text='<%# Convert.ToInt32(DataBinder.Eval(Container, "RowIndex"))+1 %>'></asp:Label>
                    </ItemTemplate>
               </asp:TemplateField> 

根据我在这里学到的东西,然后是一些实验,这是在 VB 中对我有用的东西。 它在添加或删除记录时对行重新编号。

Private Sub NumberGridViewRows() Handles DataGridView1.RowsAdded, DataGridView1.RowsRemoved
    Dim row As DataGridViewRow
    For Each row In DataGridView1.Rows
        row.HeaderCell.Value = (row.Index + 1).ToString
    Next
End Sub
  1. 添加<asp:Label ID="rowNumber" runat="server" /> in <ItemTemplate>
  2. 然后将 OnRowDataBound="gridEditorDocs_RowDataBound" 添加到 GridView 定义中
  3. 然后添加处理程序:

    protected void gridEditorDocs_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex >= 0)
        {
            Label rowNumber = e.Row.FindControl("rowNumber") as Label;
            if (rowNumber != null)
                rowNumber.Text = string.Format("{0}.", e.Row.RowIndex + 1);
        }
    }
    

如果要在行标题(即不在网格中(中看到行 #,请确保使用 Rows[] 的 HeaderCell 属性,如下所示。这将处理数据网格视图的 RowPostPaint 事件。

private void dgvUserAct_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
  this.dgvUserAct.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
}

一种更简单的方法是在预绘制中设置行标题值。 然后,您需要确保它们尚未在将来的油漆上设置,因为设置该值会导致另一种油漆。 这个片段对我有用,不会导致连续的油漆。 这也将使行正确编号 (1..nn(,即使您对添加或删除行进行排序也是如此。 绑定工作正常。

    private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        String hdrNum =  String.Format("{0}", e.RowIndex + 1);
        if (dgvResults.Rows[e.RowIndex].HeaderCell.Value == null || hdrNum != dgvResults.Rows[e.RowIndex].HeaderCell.Value.ToString())
        {
            dgvResults.Rows[e.RowIndex].HeaderCell.Value = hdrNum;
        }
    }
我知道

这是一个非常古老的话题,但只是为了记录,一旦我们需要找出一个快速的解决方案,即如何在 DataGridView 中对行进行编号。该程序由许多 DataGridViews、许多 dll 组成,使用 3 个不同的 SQL 引擎,以及没有记录编号的表......因此,作为快速解决方案,我们使用了CellFormating Event。今天,我不确定这是否是一个好主意,但当时它奏效了。

下面是示例代码:


 this.DataGridView1.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.DataGridView1_CellFormatting);
            
     private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
     {
        //We put the numbers into first cell
        if (e.ColumnIndex == 0) { e.Value = e.RowIndex + 1; } 
     }