DataGridViewRowCollection.InsertRange(Int32, DataGridViewRow[]) 方法

定义

DataGridViewRow 对象插入集合中的指定位置。

public:
 virtual void InsertRange(int rowIndex, ... cli::array <System::Windows::Forms::DataGridViewRow ^> ^ dataGridViewRows);
public virtual void InsertRange (int rowIndex, params System.Windows.Forms.DataGridViewRow[] dataGridViewRows);
abstract member InsertRange : int * System.Windows.Forms.DataGridViewRow[] -> unit
override this.InsertRange : int * System.Windows.Forms.DataGridViewRow[] -> unit
Public Overridable Sub InsertRange (rowIndex As Integer, ParamArray dataGridViewRows As DataGridViewRow())

参数

rowIndex
Int32

要插入行的位置。

dataGridViewRows
DataGridViewRow[]

要添加到 DataGridViewRowCollection 中的 DataGridViewRow 对象的数组。

例外

dataGridViewRowsnull

rowIndex 小于零或大于集合中的行数。

dataGridViewRows 只包含一行,并且它包含的这一行的单元格数大于控件中的列数。

关联的 DataGridView 控件正在执行以下操作之一,该操作暂时禁止添加新行:

  • 选择控件中的所有单元格。

  • 清除所选内容。

- 或 -

正在从以下 DataGridView 事件之一的处理程序调用此方法:

- 或 -

rowIndex 等于集合中的行数,且 AllowUserToAddRowstrue

- 或 -

DataGridViewDataSource 属性不是 null

- 或 -

dataGridViewRows 数组中至少有一个条目为 null

- 或 -

DataGridView 没有列。

- 或 -

dataGridViewRows 数组中至少有一行的 DataGridView 属性值不为 null

- 或 -

dataGridViewRows 数组中至少有一行的 Selected 属性值为 true

- 或 -

dataGridViewRows 数组中的两行或更多行相同。

- 或 -

dataGridViewRows 数组中至少有一行包含与控件中相应列的类型不兼容的类型的一个或多个单元格。

- 或 -

dataGridViewRows 数组中至少有一行包含的单元格数大于控件中的列数。

- 或 -

此操作在未冻结的行之后插入一些冻结的行,或在冻结的行之前插入一些未冻结的行。

示例

下面的代码示例演示如何使用 InsertRange 方法在所选行之前插入行,以解决“备注”部分中指示的 bug。

// Workaround for bug that prevents DataGridViewRowCollection.InsertRange
// from working when any rows before the insertion index are selected.
private void InsertRows(int index, params DataGridViewRow[] rows)
{
    System.Collections.Generic.List<int> selectedIndexes =
        new System.Collections.Generic.List<int>();
    foreach (DataGridViewRow row in dataGridView1.SelectedRows)
    {
        if (row.Index >= index)
        {
            selectedIndexes.Add(row.Index);
            row.Selected = false;
        }
    }
    dataGridView1.Rows.InsertRange(index, rows);
    foreach (int selectedIndex in selectedIndexes)
    {
        dataGridView1.Rows[selectedIndex].Selected = true;
    }
}
' Workaround for bug that prevents DataGridViewRowCollection.InsertRange
' from working when any rows before the insertion index are selected.
Private Sub InsertRows(ByVal index As Integer, _
    ByVal ParamArray rows As DataGridViewRow())

    Dim selectedIndexes As New System.Collections.Generic.List(Of Integer)

    For Each row As DataGridViewRow In dataGridView1.SelectedRows
        If row.Index >= index Then
            selectedIndexes.Add(row.Index)
            row.Selected = False
        End If
    Next row

    dataGridView1.Rows.InsertRange(index, rows)

    For Each selectedIndex As Integer In selectedIndexes
        dataGridView1.Rows(selectedIndex).Selected = True
    Next selectedIndex

End Sub

注解

如果可能,方法 InsertRange 将共享行添加到 DataGridViewRowCollection。 否则,新行将取消共享。 有关详细信息,请参阅 缩放 Windows 窗体 DataGridView 控件的最佳做法

添加新行时,控件中的行不会自动排序。 若要将新行排序到正确的位置,请在事件处理程序中DataGridView.RowsAdded调用 DataGridView.Sort 方法。 你可能还希望在事件处理程序中CellValueChanged调用 DataGridView.Sort 方法,以在用户修改单元格时对行进行排序。

重要

由于 bug, InsertRange 如果选择了索引大于 rowIndex 的任何行,方法将使应用程序停止响应。 若要解决此 bug,必须在调用此方法之前取消选择这些行,并在之后重新选择这些行。 有关详细信息,请参阅本主题中的代码示例。

适用于

另请参阅