選択されているすべての行を削除するには?

文書番号 : 40500     文書種別 : 使用方法     登録日 : 2017/07/26     最終更新日 : 2017/07/26
文書を印刷する
対象製品
MultiRow for Windows Forms 10.0J
詳細
GcMultiRowコントロールで、ユーザーによって選択された行をすべて削除するにはいくつかの方法を利用できます。
次のコードは、削除するコードを試すためにGcMultiRowコントロールに行を追加し、すべての行を選択します。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

Me.GcMultiRow1.RowCount = 10
SelectionActions.SelectAll.Execute(Me.GcMultiRow1)

[C#]
using GrapeCity.Win.MultiRow;

this.gcMultiRow1.RowCount = 10;
SelectionActions.SelectAll.Execute(this.gcMultiRow1);

1. アクションを使う
ショートカット キーの組み込みのアクションを使用すると、次の処理で選択行を削除できます。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

EditingActions.DeleteSelectedRows.Execute(Me.GcMultiRow1)

[C#]
using GrapeCity.Win.MultiRow;

EditingActions.DeleteSelectedRows.Execute(this.gcMultiRow1);

※新規行は削除の対象となりません。新規行を無効にするには、GcMultiRow.AllowUserToAddRows プロパティを False に設定します。

2. 選択コレクションのコピーを使う
選択コレクションのコピーを使って行を削除する場合は、コレクションを直接参照しないので行を削除することによるインデックスのずれを考慮する必要がありません。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
Dim selectedRows() As Row = New Row(gcMultiRow.SelectedRows.Count - 1) {}
gcMultiRow.SelectedRows.CopyTo(selectedRows, 0)
For i As Integer = selectedRows.Length - 1 To 0 Step -1
    If Not selectedRows(i).IsNewRow Then
        gcMultiRow.Rows.Remove(selectedRows(i))
    End If
Next

[C#]
using GrapeCity.Win.MultiRow;

GcMultiRow gcMultiRow = this.gcMultiRow1;
Row[] selectedRows =new Row[gcMultiRow.SelectedRows.Count];
gcMultiRow.SelectedRows.CopyTo(selectedRows, 0);
for (int i = 0; i < selectedRows.Length; i++)
{
    if(!selectedRows[i].IsNewRow)
        gcMultiRow.Rows.Remove(selectedRows[i]);
}

3. LINQを使う
LINQを使用できる環境では、次のようなコードで選択されているすべての行を削除できます。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
For Each selectedRow As Row In gcMultiRow.SelectedRows.OrderByDescending(Function(row) row.Index)
    If Not selectedRow.IsNewRow Then
        gcMultiRow.Rows.RemoveAt(selectedRow.Index)
    End If
Next

[C#]
using GrapeCity.Win.MultiRow;

GcMultiRow gcMultiRow = this.gcMultiRow1;
foreach (Row selectedRow in gcMultiRow.SelectedRows.OrderByDescending(row => row.Index))
{
    if (!selectedRow.IsNewRow)
        gcMultiRow.Rows.RemoveAt(selectedRow.Index);
}

または、次のように記述して選択以外の条件に対応することもできます。

[Visual Basic]
Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
Dim query As IEnumerable(Of Row) = gcMultiRow.Rows.Where(Function(row) row.Selected AndAlso Not row.IsNewRow).OrderByDescending(Function(row) row.Index)
For Each selectedRow As Row In query
    gcMultiRow.Rows.RemoveAt(selectedRow.Index)
Next

[C#]
GcMultiRow gcMultiRow = this.gcMultiRow1;
IEnumerable<Row> query = gcMultiRow.Rows.Where(row => row.Selected && !row.IsNewRow).OrderByDescending(row => row.Index);
foreach (Row selectedRow in query)    
{
    gcMultiRow.Rows.RemoveAt(selectedRow.Index);
}

または、各言語の構文を使用して同様の処理を記述できます。

[Visual Basic]
Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
Dim query = From row As Row In gcMultiRow.Rows Where row.Selected AndAlso Not row.IsNewRow Order By row.Index Descending Select row
For Each selectedRow As Row In query
    gcMultiRow.Rows.RemoveAt(selectedRow.Index)
Next

[C#]
GcMultiRow gcMultiRow = this.gcMultiRow1;
var query = from Row row in gcMultiRow.Rows where row.Selected && !row.IsNewRow orderby row.Index descending select row;
foreach (var selectedRow in query)
{
    gcMultiRow.Rows.RemoveAt(selectedRow.Index);
}

参考:DataGridViewとの違い

DataGridViewコントロールでは、次のコードによって選択された行を削除できますが、同様のコードはGcMultiRowコントロールでは異なる動作となります。GcMultiRowコントロールは行が削除された際に既存の選択範囲を解除します。これは、パフォーマンスを向上するためのGcMultiRow固有の実装によるものです。

[Visual Basic]
Me.dataGridView1.RowCount = 10
Me.dataGridView1.SelectAll()

Dim dataGridView As DataGridView = Me.DataGridView1
For i As Integer = dataGridView.RowCount - 1 To 0 Step -1
    If dataGridView.Rows(i).Selected = True AndAlso Not dataGridView.Rows(i).IsNewRow Then
        dataGridView.Rows.RemoveAt(i)
    End If
Next

[C#]
this.dataGridView1.RowCount = 10;
this.dataGridView1.SelectAll();

DataGridView dataGridView = this.dataGridView1;
for (int i = dataGridView.RowCount - 1; i > -1; i--)
{
    if (dataGridView.Rows[i].Selected == true && !dataGridView.Rows[i].IsNewRow)
        dataGridView.Rows.RemoveAt(i);
}