選択されているすべての行を削除するには
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); }