使用foreach

时间:2015-12-22 10:33:04

标签: c# winforms datagridview

如何使用foreach以相反的顺序访问DataGridView.SelectedRows?

哪一个更好的foreach或在C#中循环?
如果我选择多行,下面的代码片段会以相反的顺序给出行。

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;
    }

我需要一种有效的方法来实际在datagridview中检索行。

1 个答案:

答案 0 :(得分:0)

您有两个选择

(A)使用反向for循环代替foreach

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

(B)创建像这样的扩展方法

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];
    }
}

并按如下方式使用

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