Using a form to filter a data view web part - or NOT

This is a modified post. My original code sample was more complicated than it needed to be. This one is WAY simpler.

I was just thinking that it should be a lot easier to use a Form Web Part and be able to either filter a data view based on that Form's contents, or to pass in an “ALL” value. Basically, when you enable the Filtering toolbar for the Data View, this is what you get, but in my scenario, I wanted to be able to go cross-page with my filter.

My wife had a baby 2 weeks ago, so I've been OOF for a bit, but this morning I sat down and decided I needed to enable this for my baby's blog...

Here it is. For this example, I just use the Announcements list default views because wss sites usually get this list by default.

  1. On a new page insert a few of the Announcements list
  2. Insert a Form Web Part
  3. Change the input type of the Form to be a drop-down field and add some values:
    1. All
    2. 1
    3. 2
  4. Place the cursor into the Data View you created in Step 1 and click on Table..Select > Row
  5. Click on Data..Conditional Formatting
  6. Click on Create
  7. Click on “Show content...“
  8. Field Name == ID
  9. Comparison == Equals
  10. Value == [Input Paramter]
  11. Click OK
  12. Right click the Form Web Part > Web Part Connections
  13. Provide Data Values to...
  14. Web Part on this page...
  15. Modify view using Parameters from...
  16. D1 == Input Parameter
  17. Finish the wizard
  18. Now switch to code view
  19. Add an OR so that we test for the FilterParameter saying 'All'.

currently, the dvt_1.body template looks like this:

<xsl:template name="dvt_1.body">
<xsl:param name="Rows"/>
<xsl:param name="FirstRow"/>
<xsl:param name="LastRow"/>
<xsl:for-each select="$Rows">
<xsl:variable name="KeepItemsTogether" select="false()"/>
<xsl:variable name="HideGroupDetail" select="false()"/>
<xsl:variable name="GroupStyle" select="'auto'"/>
<xsl:if test="(position() &gt;= $FirstRow and position() &lt;= $LastRow) or $KeepItemsTogether">
<xsl:if test="not($HideGroupDetail)" ddwrt:cf_ignore="1">
<xsl:if test="@ID = $filterParam">
<tr style="display:{$GroupStyle}">
<td class="ms-vb"><xsl:value-of select="@Title"/></td>
<td class="ms-vb"><xsl:value-of select="@Editor"/></td>
<td class="ms-vb"><xsl:value-of select="ddwrt:FormatDate(string(@Modified), 1033, 5)"/></td>
</tr>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>

You need to add the code in bright red:

<xsl:template name="dvt_1.body">
<xsl:param name="Rows"/>
<xsl:param name="FirstRow"/>
<xsl:param name="LastRow"/>
<xsl:for-each select="$Rows">
<xsl:variable name="KeepItemsTogether" select="false()"/>
<xsl:variable name="HideGroupDetail" select="false()"/>
<xsl:variable name="GroupStyle" select="'auto'"/>
<xsl:if test="(position() &gt;= $FirstRow and position() &lt;= $LastRow) or $KeepItemsTogether">
<xsl:if test="not($HideGroupDetail)" ddwrt:cf_ignore="1">
<xsl:if test="@ID = $filterParam or $filterParam = 'All'">
<tr style="display:{$GroupStyle}">
<td class="ms-vb"><xsl:value-of select="@Title"/></td>
<td class="ms-vb"><xsl:value-of select="@Editor"/></td>
<td class="ms-vb"><xsl:value-of select="ddwrt:FormatDate(string(@Modified), 1033, 5)"/></td>
</tr>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>

20. Save the page and check it out in the browser.

Good luck!
-John