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.
- On a new page insert a few of the Announcements list
- Insert a Form Web Part
- Change the input type of the Form to be a drop-down field and add some values:
- All
- 1
- 2
- Place the cursor into the Data View you created in Step 1 and click on Table..Select > Row
- Click on Data..Conditional Formatting
- Click on Create
- Click on “Show content...“
- Field Name == ID
- Comparison == Equals
- Value == [Input Paramter]
- Click OK
- Right click the Form Web Part > Web Part Connections
- Provide Data Values to...
- Web Part on this page...
- Modify view using Parameters from...
- D1 == Input Parameter
- Finish the wizard
- Now switch to code view
- 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() >= $FirstRow and position() <= $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() >= $FirstRow and position() <= $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
Comments
Anonymous
June 10, 2004
The comment has been removedAnonymous
June 10, 2004
The comment has been removedAnonymous
June 18, 2004
Congrats on the baby! Ours was June 3, was yours the same?Anonymous
June 18, 2004
May 27th, actually. Now I need a nap.Anonymous
June 29, 2004
Congratulations, John - I hope everyone's doing well!Anonymous
July 15, 2004
Only just come back across this post after the update.
Congrats on the baby :)
Thanks for this post - it's inspired me to have a play on my blog :)Anonymous
January 21, 2009
PingBack from http://www.keyongtech.com/2021550-dataview-does-not-return-anyAnonymous
May 29, 2009
PingBack from http://paidsurveyshub.info/story.php?title=frontpoint-using-a-form-to-filter-a-data-view-web-part-or-not