Is Refactoring with different class casting and property calling possible ?
This should work if you don't want to change anything in your classes:  

var rows = new Dictionary&lt;string, Func&lt;DataRow, ShowReport&gt;&gt;
       {
          {"BillOfMaterial", dr =&gt; ((MISheetDataSet.BillOfMaterialRow)dr).mi1_BillOfMaterial},
          {"LayerBuildUp", dr =&gt; ((MISheetDataSet.LayerRow)dr).mi1_LayerBuildUp},
          {"Construction", dr =&gt; ((MISheetDataSet.ConstructionRow)dr).mi2_Construction},
       };

foreach (var row in rows)
{
    var dataRow = pObjDataset.Tables[row.Key].Rows[0];
    var showReportExtractor = row.Value;
    var showReport = showReportExtractor(dataRow);
    if (showReport == ShowReport.False)
        pObjDataset.Tables[row.Key].Clear();
}


(Don't forget to give meaningful names to variables)

But I would consider refactoring classes to allow more straightforward extraction of these mi1_BillOfMaterial, mi1_LayerBuildUp, mi2_Construction members. You have three classes here, each of them has ShowReport property but with different name. The idea is to extract a base class which will have this property, in this case we won't need to know the exact type of the row:  

public abstract class RowBase
{
    public abstract ShowReport ShowReport { get; }
}

public class BillOfMaterialRow : RowBase
{
    public override ShowReport ShowReport { get { return mi1_BillOfMaterial; } }
}

// Two other classes implemented in the same way


And then your method will be as simple as:  

var rows = new []
       {
          "BillOfMaterial",
          "LayerBuildUp",
          "Construction", 
       };

foreach (var tableName in rows)
{
    var row = (RowBase)pObjDataset.Tables[tableName].Rows[0];
    if (row.ShowReport == ShowReport.False)
        pObjDataset.Tables[tableName].Clear();
}