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

文書番号 : 26873     文書種別 : 使用方法     最終更新日 : 2009/03/26
文書を印刷する
対象製品
MultiRow for Windows Forms 5.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 を使う(Visual Studio 2008 + .NET Framework 3.5 のみ)
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);
}

この文書は、以前は次のFAQ IDで公開されていました : 11724