Getting compiler error while using for each row loop , i am trying to filter an excel sheet and want to display the filtered result


#1


#2

You need to use for each instead of for each row with TypeArgument System.Data.DataRow

You are iterating a DataRow Array not a DataTable.

To make your logic work add values.CopyToDataTable in for each row.


#3

Hi vvaidya,
while using for each it is not showing the result instead it shows system.data.datarow

else this error displayed


#4

.CopyToDataTable returns a DataTable object, so you’d need to use:

Foreach System.DataRow item in values.CopyToDataTable().Rows

But it’s redundant.
It’s a matter of understanding your data types.
.Select(filter) returns an Array of DataRow (or DataRow[]). You can iterate it directly with ForEach loop if you set TypeArgument to System.DataRow, since Arrays are IEnumerable.

.CopyToDataTable returns a DataTable object. You can iterate it with ForEachRow loop directly (Foreach row in yourDataTable) or with ForEach loop if you specify the rows collection (Foreach row in yourDataTable.Rows).

Sidenote/personal opinion:
I’d recommend against using ForEachRow in the long run, as it can only accept a DataTable object. If you’ll use ForEach loop, you can use any IEnumerable<T> type - arrays, lists etc. without redoing the activity (so f.e. if you need to add a filter through .Select you don’t need to jump the hoops of .CopyToDataTable - it will work as-is, since both DataRow[] and DataTable.Rows are an IEnumerable<DataRow>).


#5

Hi,

The solution is

  1. Use ‘For each’ instead of ‘For each row’.
  2. Create a variable of datarow[] and iterate it in foreach loop. In the properties window of the for each loop set ‘typeargument’ to System.Data.Datarow.

This will solves your problem. Create a Messagebox at the end and print the output variable in it.