繁体   English   中英

如何对DataGridView的行进行编号?

[英]How to number the rows of 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中使用循环尝试了上面的消化,它们产生了错误的行号

干杯

//You can also use below code

this.DataGridView1.Rows[e.RowIndex].Cell[0].value =e.RowIndex + 1;

//获取总行数

this.DataGridView1.Rows.Count;

您应该将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;

大多数这些解决方案最初用于添加行号。 但是,如果将行号添加到行标题然后重新排序列,则它们都会消失 所以你应该做的是使用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有正确的想法,我稍微修改了他的回答,使用数据绑定gridview以及一个手动构建。

将此添加到RowsAdded事件行每次添加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 =您的行号列中的任何一列

在网格中添加一个标题为'Row Num'的列,并将其转换为模板字段

Eval RowIndex数字并将其转换为整数并添加一个..

或者复制数据网格内的代码

               <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> 

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

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

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

绑定其DataGridView的替代方法是创建一个循环并为每一行编号的方法。

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

然后,可以在DataGridView中加载数据后调用此方法。

在网格中添加一个标题为“Number”的列(作为第一列),并将此代码放入其OnRowAdded事件中:

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

您必须手动填充网格并且不要绑定它编辑:这对绑定列表起作用,只要先绑定它然后构造列表。

根据我在这里学到的东西,然后进行一些实验,这是在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>添加<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属性,如下所示。 这将处理datagridview的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 事件。 今天,我不确定这是否是一个好主意,但当时它非常有效。

这是示例代码:



 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; } 
     }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM