Vikrant Mishra
Vikrant Mishra

Reputation: 61

DataGridView.SelectedRows(WinForms) in reverse order using foreach

How to access DataGridView.SelectedRows in reverse order using foreach?

Which one is better foreach or for loop in C#?
Below code snippet giving rows in reverse order if I select mulitple rows.

public static DataTable GetSelectedData(DataGridView dgv)
    {
        DataTable selectedData = new DataTable();

        foreach (DataGridViewColumn col in dgv.Columns)
        {
            selectedData.Columns.Add(col.Name, col.ValueType != null ? col.ValueType : typeof(string));
        }

        foreach (DataGridViewRow selectedRow in dgv.SelectedRows)
        {
            var dtRow = selectedData.NewRow();
            for (int i1 = 0; i1 < dgv.Columns.Count; i1++)
                dtRow[i1] = (selectedRow.Cells[i1].Value == null ? DBNull.Value : selectedRow.Cells[i1].Value);
            selectedData.Rows.Add(dtRow);
        }

        return selectedData;
    }

I need an efficient way to retrieve rows in order actually in the datagridview.

Upvotes: 1

Views: 2189

Answers (1)

Ivan Stoev
Ivan Stoev

Reputation: 205629

You have two options

(A) Use reverse for loop instead of foreach

for (int i = dgv.SelectedRows.Count - 1; i >= 0; i--)
{
    var selectedRow = dgv.SelectedRows[i];
    // ...
}

(B) Create an extension method like this

public static class DataGridViewExtensions
{
    public static IEnumerable<DataGridViewRow> GetSelectedRows(this DataGridView source)
    {
        for (int i = source.SelectedRows.Count - 1; i >= 0; i--)
            yield return source.SelectedRows[i];
    }
}

and use it as follows

foreach (var selectedRow in dgv.GetSelectedRows())
{
    // ...
}

Upvotes: 2

Related Questions