<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx</link><description>If you have ever attempted to sort repeating node data (i.e. a Repeating Table or Repeating Section) on an InfoPath form, you will find this functionality is not available through the UI. However, using .NET classes you can easily implement a sorting</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#10382156</link><pubDate>Thu, 03 Jan 2013 18:30:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10382156</guid><dc:creator>wizmotr</dc:creator><description>&lt;p&gt;I&amp;#39;m new to SharePoint 2010, having never used SharePoint 2007. &lt;/p&gt;
&lt;p&gt;Thanks so much for this code and your explanation; it was very understandable and I was able to successfully debug my code. I would however suggest modifying the comment at the start of the AddNewRow procedure to state:&lt;/p&gt;
&lt;p&gt;//Once you have this, use the &amp;quot;Publish&amp;quot; button from the File menu in&lt;/p&gt;
&lt;p&gt;//InfoPath and choose &amp;quot;Export Source Files&amp;quot;. Then locate the &lt;/p&gt;
&lt;p&gt;//appropriate expression in your Manifest.xsf file&lt;/p&gt;
&lt;p&gt;The comment in the source code seems to be a holdover from SharePoint 2007 and it took me a while to figure out how to extract source files in 2010.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10382156" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9454577</link><pubDate>Mon, 02 Mar 2009 18:29:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9454577</guid><dc:creator>infopath1</dc:creator><description>&lt;p&gt;Hi spawforths,&lt;/p&gt;
&lt;p&gt;What this error indicates is the &amp;quot;vxnNewRow&amp;quot; variable is not declared at the correct location. Now, if you are using the sample code I provided, then the variable name should be &amp;quot;xnNewRow&amp;quot; - did you change the variable names? If so, then it sounds like it is not declared at the correct location.&lt;/p&gt;
&lt;p&gt;The other thing it could be is when you create that variable, it is done on this line:&lt;/p&gt;
&lt;p&gt;XPathNavigator xnNewRow = xn.SelectSingleNode(&amp;quot;/my:myFields/dataFields/d:Project_Hours[last()]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt;Maybe in your case, the XPATH expression does not return any rows? If not, when you step through the code and hover your mouse over this variable (after moving past this line) if the &amp;quot;vxnNewRow&amp;quot; variable is &amp;quot;null&amp;quot; then there again is a problem with the expression.&lt;/p&gt;
&lt;p&gt;Scott&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9454577" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9454001</link><pubDate>Mon, 02 Mar 2009 13:07:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9454001</guid><dc:creator>spawforths</dc:creator><description>&lt;p&gt;Hi Scott,&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Thanks for that, &lt;/p&gt;
&lt;p&gt; &amp;nbsp;I started to change the x-path references, it seems to fail on &lt;/p&gt;
&lt;p&gt;vxnNewRow.SelectSingleNode(&amp;quot;@Project&amp;quot;, this.NamespaceManager).SetValue(strProject);&lt;/p&gt;
&lt;p&gt;But it gives me the error: The name ' vxnNewRow' does not exist in the current context.&lt;/p&gt;
&lt;p&gt;any idea?&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9454001" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9447551</link><pubDate>Fri, 27 Feb 2009 01:32:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9447551</guid><dc:creator>infopath1</dc:creator><description>&lt;p&gt;Hi spawforths,&lt;/p&gt;
&lt;p&gt;It may simply be your XPATH expressions are not correct. For instance, this looks wrong:&lt;/p&gt;
&lt;p&gt;XPathExpression xe = xn.Compile(&amp;quot;/my:myFields/dataFields/d:Project_Hours&amp;quot;);&lt;/p&gt;
&lt;p&gt;If you have built your XSN from a data source (i.e. SQL), this would typically be like this:&lt;/p&gt;
&lt;p&gt;XPathExpression xe = xn.Compile(&amp;quot;/my:myFields/dfs:dataFields/d:Project_Hours&amp;quot;);&lt;/p&gt;
&lt;p&gt;To be sure of the XPATH expressions you can select the node you want in the Data Source Task Pane, right-click and choose Copy XPath.&lt;/p&gt;
&lt;p&gt;I would first verify all your expressions and if it still fails, then you will need to debug (step through) your code to find the exact line that is failing and correct that problem.&lt;/p&gt;
&lt;p&gt;Scott&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9447551" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9446691</link><pubDate>Thu, 26 Feb 2009 18:09:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9446691</guid><dc:creator>spawforths</dc:creator><description>&lt;p&gt;The error I receive is&lt;/p&gt;
&lt;p&gt;nullReferenceException was unhandled by user code&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9446691" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9446641</link><pubDate>Thu, 26 Feb 2009 17:40:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9446641</guid><dc:creator>spawforths</dc:creator><description>&lt;p&gt;Thanks for that, &amp;nbsp;I managed to get to work. &lt;/p&gt;
&lt;p&gt;When I try and get it to work by altering the code for another form I struggle.&lt;/p&gt;
&lt;p&gt;The form I am trying use is a repeatable table that submits to an SQL database. &lt;/p&gt;
&lt;p&gt;My 6 fields are &lt;/p&gt;
&lt;p&gt;Project &lt;/p&gt;
&lt;p&gt;Project_FD&lt;/p&gt;
&lt;p&gt;Date_Worked&lt;/p&gt;
&lt;p&gt;Work_Code&lt;/p&gt;
&lt;p&gt;Work_Description&lt;/p&gt;
&lt;p&gt;Here is my altered code, although it fails on &lt;/p&gt;
&lt;p&gt;if (xnSortField.Value == ControlID)&lt;/p&gt;
&lt;p&gt; public void btnPro_Clicked(object sender, ClickedEventArgs e)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SpecifySortOptions(&amp;quot;Project&amp;quot;, XmlDataType.Text, e.ControlId);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SpecifySortOptions(string SortField, XmlDataType dataType, string ControlID)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create Navigator objects for the main DOM and &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//for the SortOrder and SortField fields&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xn = this.MainDataSource.CreateNavigator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnSortOrder = xn.SelectSingleNode(&amp;quot;/my:myFields/my:SortOrder&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnSortField = xn.SelectSingleNode(&amp;quot;/my:myFields/my:SortField&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Check to see if the value of the SortField is equal &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//to the ControlID that we passed to this procedure. If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//it is the same and the SortOrder field is an SortOrder&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//emptry string or is set to &amp;quot;Desc&amp;quot; then set the field to &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;quot;Asc&amp;quot;. If the SortField value does not equal the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//ControlID that we passed to this procedure, then that &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//would mean either the SortField is an empty string or &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//it was set to another field - either way, we will &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//then want the SortOrder value to be &amp;quot;Asc&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (xnSortField.Value == ControlID)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (xnSortOrder.Value == &amp;quot;&amp;quot; || xnSortOrder.Value == &amp;quot;Desc&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortOrder.SetValue(&amp;quot;Asc&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortOrder.SetValue(&amp;quot;Desc&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortOrder.SetValue(&amp;quot;Asc&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Call the SortTheData() procedure passing in the values &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//specified above&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SortTheData(SortField, xnSortOrder.Value, dataType);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Set the SortField value to the current ControlID&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortField.SetValue(ControlID);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SortTheData(string strSortField, string strSortOrder, XmlDataType dataType)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create a Navigator object for the main DOM&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xn = this.MainDataSource.CreateNavigator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XmlSortOrder sortOrder = XmlSortOrder.Ascending;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strSortOrder == &amp;quot;Desc&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sortOrder = XmlSortOrder.Descending;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathExpression xe = xn.Compile(&amp;quot;/my:myFields/dataFields/d:Project_Hours&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xe.AddSort(&amp;quot;*[local-name()='&amp;quot; + strSortField + &amp;quot;']&amp;quot;, sortOrder, XmlCaseOrder.None, &amp;quot;&amp;quot;, dataType);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xe.SetContext(this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNodeIterator xi = xn.Select(xe);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator firstNode = xn.SelectSingleNode(&amp;quot;/my:myFields/dataFields/d:Project_Hours[1]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator lastNode = xn.SelectSingleNode(&amp;quot;/my:myFields/dataFields/d:Project_Hours[&amp;quot; + xi.Count + &amp;quot;]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;firstNode.DeleteRange(lastNode);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (xi.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create string variables to hold the values of each field &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//as we iterate the nodes&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strProject = xi.Current.SelectSingleNode(&amp;quot;my:Project&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strProject_FD = xi.Current.SelectSingleNode(&amp;quot;my:Project_FD&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strDate_Worked = xi.Current.SelectSingleNode(&amp;quot;my:Date_Worked&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strWork_Code = xi.Current.SelectSingleNode(&amp;quot;my:Work_Code&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strWork_Description = xi.Current.SelectSingleNode(&amp;quot;my:Work_Description&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strBillable_Hours = xi.Current.SelectSingleNode(&amp;quot;my:Billable_Hours&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Call the AddNewRow method to append a new row &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// to the repeating group&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AddNewRow(xn.SelectSingleNode(&amp;quot;/my:myFields/dataFields&amp;quot;, this.NamespaceManager));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Since we are continually appending new rows, the &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;quot;last&amp;quot; row will always be the one where we need &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//to set the values - so here we will create a &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Navigator object for this newly added row - we &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//will use this for setting the field values below&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnNewRow = xn.SelectSingleNode(&amp;quot;/my:myFields/dataFields/d:Project_Hours[last()]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Project&amp;quot;, this.NamespaceManager).SetValue(strProject);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Project_FD&amp;quot;, this.NamespaceManager).SetValue(strProject_FD);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Work_Description&amp;quot;, this.NamespaceManager).SetValue(strWork_Description);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Since the Age field is numeric, it will contain&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//the &amp;quot;nil&amp;quot; attribute. We need to remove this &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//arrtibute prior to programmatically setting the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//value. To do this, we'll call the DeleteNil &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//procedure passing it the node that contains &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(or may contain) the nil attribute&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DeleteNil(xnNewRow.SelectSingleNode(&amp;quot;my:Date_Worked&amp;quot;, this.NamespaceManager));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DeleteNil(xnNewRow.SelectSingleNode(&amp;quot;my:Work_Code&amp;quot;, this.NamespaceManager));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DeleteNil(xnNewRow.SelectSingleNode(&amp;quot;my:Billable_Hours&amp;quot;, this.NamespaceManager));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Now we can set the value of the Age field&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Date_Worked&amp;quot;, this.NamespaceManager).SetValue(strDate_Worked);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Work_Code&amp;quot;, this.NamespaceManager).SetValue(strWork_Code);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Billable_Hours&amp;quot;, this.NamespaceManager).SetValue(strBillable_Hours);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void AddNewRow(XPathNavigator docXN)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create a Navigator object to reference the node &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//we will be adding. To do this, we can use the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//templates' &amp;quot;Manifest.xsf&amp;quot; file to get the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//appropriate node to add. As you can see, this is &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//specific to the control's &amp;quot;name&amp;quot;, which you can &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//get from the Advanced tab on the Properties window &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//for the repeating control. Once you have this, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//use the &amp;quot;Save As Source Files&amp;quot; command from the &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//File menu in InfoPath and locate the appropriate &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//expression in your Manifest.xsf file&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnNode = this.Template.Manifest.SelectSingleNode(&amp;quot;//xsf:xDocumentClass/xsf:views/xsf:view/xsf:editing/xsf:xmlToEdit[@name='Project_Hours_1']/xsf:editWith/xsf:fragmentToInsert/xsf:chooseFragment/my:group1&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Append the node from the Manifest file to the main DOM&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;docXN.SelectSingleNode(&amp;quot;/my:myFields/dataFields&amp;quot;, this.NamespaceManager).AppendChild(xnNode.InnerXml);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void DeleteNil(XPathNavigator node)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Check to see if the nil attribute exists &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//and if so, delete it&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (node.MoveToAttribute(&amp;quot;nil&amp;quot;, &amp;quot;&lt;a rel="nofollow" target="_new" href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/a&gt;))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node.DeleteSelf();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9446641" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9444040</link><pubDate>Wed, 25 Feb 2009 16:12:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9444040</guid><dc:creator>infopath1</dc:creator><description>&lt;p&gt;Hi spawforths,&lt;/p&gt;
&lt;p&gt;I apologize as I am not sure what happened to the attachment with the completed code; however, here are all the procedures as I documented them in this post. If you followed the naming conventions in this sample you should be able to copy and paste the code in each procedure. NOTE: For ease, I named by buttons as follows:&lt;/p&gt;
&lt;p&gt;btnLastName&lt;/p&gt;
&lt;p&gt;btnFirstName&lt;/p&gt;
&lt;p&gt;btnAge&lt;/p&gt;
&lt;p&gt;public void btnLastName_Clicked(object sender, ClickedEventArgs e)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SpecifySortOptions(&amp;quot;LastName&amp;quot;, XmlDataType.Text, e.ControlId);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void btnFirstName_Clicked(object sender, ClickedEventArgs e)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SpecifySortOptions(&amp;quot;FirstName&amp;quot;, XmlDataType.Text, e.ControlId);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void btnAge_Clicked(object sender, ClickedEventArgs e)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SpecifySortOptions(&amp;quot;Age&amp;quot;, XmlDataType.Text, e.ControlId);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SpecifySortOptions(string SortField, XmlDataType dataType, string ControlID)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create Navigator objects for the main DOM and &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//for the SortOrder and SortField fields&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xn = this.MainDataSource.CreateNavigator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnSortOrder = xn.SelectSingleNode(&amp;quot;/my:myFields/my:SortOrder&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnSortField = xn.SelectSingleNode(&amp;quot;/my:myFields/my:SortField&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Check to see if the value of the SortField is equal &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//to the ControlID that we passed to this procedure. If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//it is the same and the SortOrder field is an SortOrder&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//emptry string or is set to &amp;quot;Desc&amp;quot; then set the field to &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;quot;Asc&amp;quot;. If the SortField value does not equal the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//ControlID that we passed to this procedure, then that &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//would mean either the SortField is an empty string or &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//it was set to another field - either way, we will &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//then want the SortOrder value to be &amp;quot;Asc&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (xnSortField.Value == ControlID)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (xnSortOrder.Value == &amp;quot;&amp;quot; || xnSortOrder.Value == &amp;quot;Desc&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortOrder.SetValue(&amp;quot;Asc&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortOrder.SetValue(&amp;quot;Desc&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortOrder.SetValue(&amp;quot;Asc&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Call the SortTheData() procedure passing in the values &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//specified above&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SortTheData(SortField, xnSortOrder.Value, dataType);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Set the SortField value to the current ControlID&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnSortField.SetValue(ControlID);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SortTheData(string strSortField, string strSortOrder, XmlDataType dataType)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create a Navigator object for the main DOM&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xn = this.MainDataSource.CreateNavigator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XmlSortOrder sortOrder = XmlSortOrder.Ascending;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strSortOrder == &amp;quot;Desc&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sortOrder = XmlSortOrder.Descending;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathExpression xe = xn.Compile(&amp;quot;/my:myFields/my:group1/my:group2&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xe.AddSort(&amp;quot;*[local-name()='&amp;quot; + strSortField + &amp;quot;']&amp;quot;, sortOrder, XmlCaseOrder.None, &amp;quot;&amp;quot;, dataType);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xe.SetContext(this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNodeIterator xi = xn.Select(xe);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator firstNode = xn.SelectSingleNode(&amp;quot;/my:myFields/my:group1/my:group2[1]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator lastNode = xn.SelectSingleNode(&amp;quot;/my:myFields/my:group1/my:group2[&amp;quot; + xi.Count + &amp;quot;]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;firstNode.DeleteRange(lastNode);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (xi.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create string variables to hold the values of each field &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//as we iterate the nodes&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strLastName = xi.Current.SelectSingleNode(&amp;quot;my:LastName&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strFirstName = xi.Current.SelectSingleNode(&amp;quot;my:FirstName&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string strAge = xi.Current.SelectSingleNode(&amp;quot;my:Age&amp;quot;, this.NamespaceManager).Value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Call the AddNewRow method to append a new row &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// to the repeating group&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AddNewRow(xn.SelectSingleNode(&amp;quot;/my:myFields/my:group1&amp;quot;, this.NamespaceManager));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Since we are continually appending new rows, the &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;quot;last&amp;quot; row will always be the one where we need &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//to set the values - so here we will create a &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Navigator object for this newly added row - we &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//will use this for setting the field values below&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnNewRow = xn.SelectSingleNode(&amp;quot;/my:myFields/my:group1/my:group2[last()]&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:LastName&amp;quot;, this.NamespaceManager).SetValue(strLastName);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:FirstName&amp;quot;, this.NamespaceManager).SetValue(strFirstName);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Since the Age field is numeric, it will contain&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//the &amp;quot;nil&amp;quot; attribute. We need to remove this &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//arrtibute prior to programmatically setting the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//value. To do this, we'll call the DeleteNil &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//procedure passing it the node that contains &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(or may contain) the nil attribute&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DeleteNil(xnNewRow.SelectSingleNode(&amp;quot;my:Age&amp;quot;, this.NamespaceManager));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Now we can set the value of the Age field&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xnNewRow.SelectSingleNode(&amp;quot;my:Age&amp;quot;, this.NamespaceManager).SetValue(strAge);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void AddNewRow(XPathNavigator docXN)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Create a Navigator object to reference the node &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//we will be adding. To do this, we can use the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//templates' &amp;quot;Manifest.xsf&amp;quot; file to get the &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//appropriate node to add. As you can see, this is &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//specific to the control's &amp;quot;name&amp;quot;, which you can &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//get from the Advanced tab on the Properties window &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//for the repeating control. Once you have this, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//use the &amp;quot;Save As Source Files&amp;quot; command from the &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//File menu in InfoPath and locate the appropriate &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//expression in your Manifest.xsf file&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;XPathNavigator xnNode = this.Template.Manifest.SelectSingleNode(&amp;quot;//xsf:xDocumentClass/xsf:views/xsf:view/xsf:editing/xsf:xmlToEdit[@name='group2_1']/xsf:editWith/xsf:fragmentToInsert/xsf:chooseFragment/my:group1&amp;quot;, this.NamespaceManager);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Append the node from the Manifest file to the main DOM&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;docXN.SelectSingleNode(&amp;quot;/my:myFields/my:group1&amp;quot;, this.NamespaceManager).AppendChild(xnNode.InnerXml);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void DeleteNil(XPathNavigator node)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Check to see if the nil attribute exists &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//and if so, delete it&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (node.MoveToAttribute(&amp;quot;nil&amp;quot;, &amp;quot;&lt;a rel="nofollow" target="_new" href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/a&gt;))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node.DeleteSelf();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;Scott&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9444040" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9443913</link><pubDate>Wed, 25 Feb 2009 14:05:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9443913</guid><dc:creator>spawforths</dc:creator><description>&lt;p&gt;I have not been able to get this to work with Infopath 2007 it just comes back and says that the form cannot be opened. &lt;/p&gt;
&lt;p&gt;Is there downloadable example of the form?&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9443913" width="1" height="1"&gt;</description></item><item><title>Sorting repeating table</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#9394117</link><pubDate>Wed, 04 Feb 2009 04:04:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9394117</guid><dc:creator>All About SharePoint - S.S. Ahmed - MVP Microsoft SharePoint</dc:creator><description>&lt;p&gt;I have already given a programmatic solution of sorting a repeating table in InfoPath but here is another&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9394117" width="1" height="1"&gt;</description></item><item><title>re: Another Way of Sorting Repeating Data</title><link>http://blogs.msdn.com/b/infopath/archive/2006/12/15/another-way-of-sorting-repeating-data.aspx#8036694</link><pubDate>Wed, 05 Mar 2008 01:11:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8036694</guid><dc:creator>infopath1</dc:creator><description>&lt;p&gt;Hi BobC,&lt;/p&gt;
&lt;p&gt;Glad you were able to get it to work.&lt;/p&gt;
&lt;p&gt;Scott&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8036694" width="1" height="1"&gt;</description></item></channel></rss>