<?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>hughpyle : Forms Demo</title><link>http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx</link><description>Tags: Forms Demo</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Furthur!</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/463060.aspx</link><pubDate>Fri, 09 Sep 2005 22:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:463060</guid><dc:creator>hpyle</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/463060.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=463060</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Here's a recap and subject-index of the story so far.&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/21/441496.aspx"&gt;&lt;FONT face=Arial size=2&gt;Getting started with Groove Forms&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;; the component parts (&lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/21/441507.aspx"&gt;&lt;FONT face=Arial size=2&gt;Fields, Forms, Views&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;); a &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441792.aspx"&gt;&lt;FONT face=Arial size=2&gt;digression&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; about the available fieldtypes; and a &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441808.aspx"&gt;&lt;FONT face=Arial size=2&gt;real example&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;.&amp;nbsp; And a hint about &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441919.aspx"&gt;&lt;FONT face=Arial size=2&gt;scripting&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; in Groove Forms.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Then a deep dive into some of &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441847.aspx"&gt;&lt;FONT face=Arial size=2&gt;Groove's synchronization internals&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;.&lt;/FONT&gt; 
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/441970.aspx"&gt;&lt;FONT face=Arial size=2&gt;Groove Web Services (GWS) overview&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;.&amp;nbsp; (You'll need the &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/08/15/443433.aspx"&gt;&lt;FONT face=Arial size=2&gt;security stuff&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; to actually use it)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;A brief look at the &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/443050.aspx"&gt;&lt;FONT face=Arial size=2&gt;Groove Enterprise Data Bridge&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, which is a scalable server for Groove Web Services.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Some GWS code in practice: &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/443095.aspx"&gt;&lt;FONT face=Arial size=2&gt;an Outlook addin&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, which can &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/26/443368.aspx"&gt;&lt;FONT face=Arial size=2&gt;enumerate Groove identities and workspaces&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, and &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/08/15/451748.aspx"&gt;&lt;FONT face=Arial size=2&gt;tools within a workspace&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;. &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;How to &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/454753.aspx"&gt;&lt;FONT face=Arial size=2&gt;identify Forms tools&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, and how to differentiate your Forms tool from others.&lt;/FONT&gt; 
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/454754.aspx"&gt;&lt;FONT face=Arial size=2&gt;Reading&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; and &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/463048.aspx"&gt;&lt;FONT face=Arial size=2&gt;writing&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; Groove Forms data using the Web Services APIs.&lt;/FONT&gt; 
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/463053.aspx"&gt;&lt;FONT face=Arial size=2&gt;The beginnings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; of a wider story, of how Groove Forms and Web Services can be used to deliver useful context to virtual workgroups in the field.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;That's where we'll pick up, later.&amp;nbsp; Meanwhile: have fun, and I hope to see you at PDC next week.&amp;nbsp; &lt;A href="http://commnet.microsoftpdc.com/VCal.aspx?SessionID=4213fe26-630d-427e-98d0-897117281921"&gt;My presentation&lt;/A&gt; is "OFF303: Groove: Building Enterprise Workgroup Applications", and it's on Tuesday, September 13 2:45 PM in room 406 AB.&amp;nbsp;&amp;nbsp; The session abstract, surprisingly enough, is just about the same as the material I've covered here to date.&amp;nbsp; I'll be bringing lots of code, plenty of customer stories, and as&amp;nbsp;open a mind as I can muster. Then we'll jump off from there.&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;This session covers the architecture and design of Groove applications connected to enterprise systems. We show how to use the Groove Forms tool to build collaborative applications with the Groove client, and take apart a custom C# application that uses the Groove Web Services to connect Groove workspaces and Groove Forms data into an enterprise process.&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;&lt;FONT face=Arial size=2&gt;See you at PDC!&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=463060" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item><item><title>Now it begins</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/463053.aspx</link><pubDate>Fri, 09 Sep 2005 22:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:463053</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/463053.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=463053</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;We've created an application which can read and write Groove data.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Groove's web services APIs also expose a very wide range of other functionality.&amp;nbsp; Let's outline some of the possibilities.&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Create a new workspace, blank, or from an archive or template (GSA file).&amp;nbsp; (See &lt;TT&gt;GrooveSpaces.CreateFromGSAByRef&lt;/TT&gt;, &lt;TT&gt;GrooveSpaces.CreateGrooveFileSharingSpace&lt;/TT&gt;&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;).&amp;nbsp; A template consists of a set of tools, and can include data (files, checklists, and so on).&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Add new tools into an existing workspace (&lt;TT&gt;GrooveTools.Create&lt;/TT&gt;).&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Read data from another system and write it into the new workspace.&amp;nbsp; And vice versa.&amp;nbsp; Files, forms records, discussions, calendar entries.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Invite people to a workspace (&lt;TT&gt;GrooveMembers.Create&lt;/TT&gt;);&amp;nbsp; or create an "invitation file" which can be posted on a website or attached to an email (&lt;TT&gt;GrooveSpaces.CreateInvitationFile&lt;/TT&gt;)&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Save a workspace as an archive (&lt;TT&gt;GrooveSpaces.ExportAsArchive&lt;/TT&gt;)&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;We've concentrated on the detail of reading and writing data, but the surrounding activities really make this thing fly.&amp;nbsp;&amp;nbsp; We call an application implementing these a "controller".&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;My full demo is almost useful.&amp;nbsp; It's a standalone application which scans a WSS list ("Incidents") looking for new records. When there's a new incident, my code &lt;U&gt;creates a new Groove workspace&lt;/U&gt;, and pulls in data from the &lt;U&gt;incident record&lt;/U&gt; and from other lists on the SharePoint site, into Groove Forms tools in the workspace.&amp;nbsp; Then it &lt;U&gt;creates an invitation&lt;/U&gt; file, and attaches the invitation to the incident record on SharePoint.&amp;nbsp; If there were an assigned responder in the incident record, it could also send an invitation proactively to that user. (All of that takes only a few seconds).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The result of that simple skeleton demo app is that an incident team can rapidly be "swarmed" to handle a new occurrence, and then work with the appropriate team to handle the incident -- &lt;U&gt;without being tied&lt;/U&gt; to the WSS site (which might be behind the firewall) -- and can continue working together even when communications is interrupted.&amp;nbsp;&amp;nbsp; After all, the Groove workspace contains all the relevant contextual data right away, with no user intervention, and members of the workspace &lt;U&gt;don't need any network access&lt;/U&gt; to work with that data - it can be read and updated offline.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;In a real system, you'd probably have the controller write data, or summary extracts, back from the workspace into the back-end whenever it changes.&amp;nbsp; You'd also run the controller on a &lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/443050.aspx"&gt;Groove Enterprise Data Bridge&lt;/A&gt; server, behind the firewall, 24/7.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Extending the reach of back-end systems, into the messy ugliness of real-world virtual team environments.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=463053" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item><item><title>Contacts to Outlook</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/463044.aspx</link><pubDate>Fri, 09 Sep 2005 21:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:463044</guid><dc:creator>hpyle</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/463044.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=463044</wfw:commentRss><description>&lt;P&gt;As you can probably tell, it's a Friday afternoon, and I still have a load more of this to get through before the weekend.&amp;nbsp; On Tuesday, I'm presenting this story at &lt;A href="http://msdn.microsoft.com/events/pdc/"&gt;PDC&lt;/A&gt;.&amp;nbsp; But the story is hidden behind all the little bits of code right now.&amp;nbsp; So let's cut the code, make room for more of the story soon.&lt;/P&gt;
&lt;P&gt;We scanned Groove workspaces and tools, and loaded Groove Forms data into a DataGridView for display in a form.&amp;nbsp; The final piece to that application is to drop the selected rows of data into Outlook's "Contacts".&lt;/P&gt;
&lt;P&gt;I implemented this by an accessor method in my form class:&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Access to the currently-selected-contacts list&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ArrayList&lt;/FONT&gt;&lt;FONT size=1&gt; GetSelectedData()&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// read the VCard for each selected contact,&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// and add it to the VCardList.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ArrayList&lt;/FONT&gt;&lt;FONT size=1&gt; dataRows = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ArrayList&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;foreach&lt;/FONT&gt;&lt;FONT size=1&gt; (&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;DataGridViewRow&lt;/FONT&gt;&lt;FONT size=1&gt; dgvr &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; dataGridView1.SelectedRows)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;dataRows.Add(((System.Data.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;DataRowView&lt;/FONT&gt;&lt;FONT size=1&gt;)dgvr.DataBoundItem).Row);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Equivalent for DataView:&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;//int n = 0;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;//foreach (System.Data.DataRow row in ((System.Data.DataTable)dataGridView1.DataSource).Rows)&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;//{&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// if (dataView.IsSelected(n))&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// {&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// dataRows.Add(row);&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// }&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// n++;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;//}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;return&lt;/FONT&gt;&lt;FONT size=1&gt; dataRows;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;And when the form is closed, the caller (my addin class) puts the selected rows into Outlook like this:&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;private&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;void&lt;/FONT&gt;&lt;FONT size=1&gt; OnToolbarButtonClick(&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;CommandBarButton&lt;/FONT&gt;&lt;FONT size=1&gt; cmdBarbutton,&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;ref&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;bool&lt;/FONT&gt;&lt;FONT size=1&gt; cancel)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;try&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Display the contact picker form&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Form1&lt;/FONT&gt;&lt;FONT size=1&gt; selectionForm = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Form1&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt;( selectionForm.ShowDialog() == System.Windows.Forms.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;DialogResult&lt;/FONT&gt;&lt;FONT size=1&gt;.OK )&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ArrayList&lt;/FONT&gt;&lt;FONT size=1&gt; rowList = selectionForm.GetSelectedData();&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;foreach&lt;/FONT&gt;&lt;FONT size=1&gt; (System.Data.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;DataRow&lt;/FONT&gt;&lt;FONT size=1&gt; row &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; rowList)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;Microsoft.Office.Interop.Outlook.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ContactItem&lt;/FONT&gt;&lt;FONT size=1&gt; contactItem;&lt;/P&gt;
&lt;P&gt;contactItem = (Microsoft.Office.Interop.Outlook.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ContactItem&lt;/FONT&gt;&lt;FONT size=1&gt;)applicationObject.CreateItem(Microsoft.Office.Interop.Outlook.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;OlItemType&lt;/FONT&gt;&lt;FONT size=1&gt;.olContactItem);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"FullName"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.FullName = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"FullName"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"NickName"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.NickName = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"NickName"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"FirstName"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.FirstName = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"FirstName"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"LastName"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.LastName = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"LastName"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"Suffix"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.Suffix = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"Suffix"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"JobTitle"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.JobTitle = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"JobTitle"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (row.Table.Columns[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"CompanyName"&lt;/FONT&gt;&lt;FONT size=1&gt;] != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) contactItem.CompanyName = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)row[&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"CompanyName"&lt;/FONT&gt;&lt;FONT size=1&gt;];&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// I think that's enough to start with. Now save it to Outlook.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;contactItem.Close(Microsoft.Office.Interop.Outlook.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;OlInspectorClose&lt;/FONT&gt;&lt;FONT size=1&gt;.olSave);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;catch&lt;/FONT&gt;&lt;FONT size=1&gt;( &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Exception&lt;/FONT&gt;&lt;FONT size=1&gt; e ) { /* stuff */ }&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;So it's only at this last stage that we need any knowledge of the fields in our data.&lt;/P&gt;
&lt;P&gt;Anyone reading this: now would be a great time to ask questions ("hughpyle" at...)!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=463044" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category></item><item><title>Reading Forms Data</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/454754.aspx</link><pubDate>Fri, 09 Sep 2005 21:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:454754</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/454754.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=454754</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;I think we can read Forms data now.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face=Arial size=2&gt;We already added event handlers to two of our three combo-boxes (IdentitiesCombo, WorkspacesCombo), so let's do the same for the ToolsCombo, which contains a list of tools in the selected workspace.&amp;nbsp; When the selection changes, we should read data from the tool.&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;private&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;void&lt;/FONT&gt;&lt;FONT size=1&gt; ToolsCombo_SelectedIndexChanged(&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;object&lt;/FONT&gt;&lt;FONT size=1&gt; sender, &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;EventArgs&lt;/FONT&gt;&lt;FONT size=1&gt; e)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Each item in the combobox is a ToolInfo, containing a Groove Tool&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ToolInfo&lt;/FONT&gt;&lt;FONT size=1&gt; t = (&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ToolInfo&lt;/FONT&gt;&lt;FONT size=1&gt;)ToolsCombo.SelectedItem;&lt;/P&gt;
&lt;P&gt;ReadDataFromTool(t.tool);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;To display the data, let's drop a DataGridView into the form, and make it read-only.&amp;nbsp; (&lt;A href="http://www.windowsforms.net/WhidbeyFeatures/default.aspx?PageID=2&amp;amp;ItemID=13&amp;amp;Cat=Controls&amp;amp;tabindex=5"&gt;DataGridView&lt;/A&gt; is new with Visual Studio 2005; if you're using Visual Studio 2003, a DataGrid is just as good).&amp;nbsp; Then, when we have some data, let's assume we also have a DataSet.&amp;nbsp;&amp;nbsp; The only magic piece here is that the data set will need a particular name ("RecordDataSet"), because that's the name we'll receive from Groove.&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;&lt;FONT color=#0000ff size=1&gt;
&lt;P&gt;private&lt;/FONT&gt;&lt;FONT color=#000000 size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;void&lt;/FONT&gt;&lt;FONT color=#000000 size=1&gt; ReadDataFromTool(&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Tool&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT color=#000000&gt; t)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;// Make a DataSet to contain the records&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;System.Data.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;DataSet&lt;/FONT&gt;&lt;FONT size=1&gt; recordDataSet = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; System.Data.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;DataSet&lt;/FONT&gt;&lt;FONT size=1&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"RecordDataSet"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// ... Get some data ...&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Bind the dataset to the grid view&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;dataGridView1.ReadOnly = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;true&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;dataGridView1.DataSource = recordDataSet.Tables[0];&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Without further comment, let's just read data.&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// The Tool has a web service URI for us to access its data via the GrooveForms service&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; toolURI = t.Data;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GrooveForms&lt;/FONT&gt;&lt;FONT size=1&gt; formsService = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GrooveForms&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;formsService.GrooveRequestHeaderValue = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveFormsWebService.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GrooveRequestHeader&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;formsService.GrooveRequestHeaderValue.GrooveRequestKey = &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GWSUtil&lt;/FONT&gt;&lt;FONT size=1&gt;.GrooveLocalRequestKey;&lt;/P&gt;
&lt;P&gt;formsService.GrooveRequestHeaderValue.GrooveIdentityURL = selectedIdentity.URI;&lt;/P&gt;
&lt;P&gt;formsService.Url = &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GWSUtil&lt;/FONT&gt;&lt;FONT size=1&gt;.GrooveURL + toolURI;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Query for all the records, no attachments&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;GrooveFormsWebService.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;RecordQuery&lt;/FONT&gt;&lt;FONT size=1&gt; recordQuery = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveFormsWebService.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;RecordQuery&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;recordQuery.FieldSchemaScopingElement = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;""&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.FieldSchemaScopingFlag = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"All"&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.FileAttachmentFormat = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"Base64"&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.FormURI = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;""&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.IncludeFileAttachmentContent = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;false&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.QueryMetadataOnly = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;false&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.UnreadRecordsOnly = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;false&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.ViewURI = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;""&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;recordQuery.WhereClause = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;""&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Ask service to query records&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;FormsRecordDataSet&lt;/FONT&gt;&lt;FONT size=1&gt; fds = formsService.QueryRecords(recordQuery);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;And we end up with a FormsRecordDataSet, which is a serialized set of Groove Forms data retrieved from the web service.&amp;nbsp; In this case we called QueryRecords(), which is a very flexible way to retrieve some or all records in a tool; it can include a WhereClause with some SQL-like syntax:&amp;nbsp; a conditional expression or a series of conditional expressions joined by AND and OR logical operators (and parentheses), with the usual comparison operators, "LIKE" and "NOT LIKE".&amp;nbsp; (The full documentation for this is in the API reference in the &lt;A href="http://www.groove.net/solutions/develop/downloads.cfm"&gt;Groove Web Services GDK&lt;/A&gt;).&amp;nbsp; To read a known subset of the data, an alternative to QueryRecords() would be ReadRecords(), which takes a list of record URIs for specific records.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The FormsRecordDataSet arrived in a SOAP packet as a chunk of XML, and it turns out that the XML format for this is designed to be essentially the same as a System.Data.DataSet serialization;&amp;nbsp; there's an array of&amp;nbsp;schema nodes, and an array of data nodes.&amp;nbsp; So we can push that XML into our DataSet quite easily:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// If schema exists, load it into the DataSet&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (fds.Schema &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;is&lt;/FONT&gt;&lt;FONT size=1&gt; System.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Array&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// For Groove V3 it's safe to assume there is only one schema in the dataset (although this may change)&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNode&lt;/FONT&gt;&lt;FONT size=1&gt;[] schemaNodes = (System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNode&lt;/FONT&gt;&lt;FONT size=1&gt;[])fds.Schema;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;foreach&lt;/FONT&gt;&lt;FONT size=1&gt; (System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNode&lt;/FONT&gt;&lt;FONT size=1&gt; schemaNode &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; schemaNodes)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;System.IO.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;StringReader&lt;/FONT&gt;&lt;FONT size=1&gt; schemaReader = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; System.IO.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;StringReader&lt;/FONT&gt;&lt;FONT size=1&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"&amp;lt;?xml version=\"1.0\"?&amp;gt;"&lt;/FONT&gt;&lt;FONT size=1&gt; + schemaNode.OuterXml);&lt;/P&gt;
&lt;P&gt;recordDataSet.ReadXmlSchema(schemaReader);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// If data exists, load it into the DataSet&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (fds.Data &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;is&lt;/FONT&gt;&lt;FONT size=1&gt; System.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Array&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNode&lt;/FONT&gt;&lt;FONT size=1&gt;[] dataNodes = (System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNode&lt;/FONT&gt;&lt;FONT size=1&gt;[])fds.Data;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;foreach&lt;/FONT&gt;&lt;FONT size=1&gt; (System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNode&lt;/FONT&gt;&lt;FONT size=1&gt; dataNode &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; dataNodes)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNodeReader&lt;/FONT&gt;&lt;FONT size=1&gt; dataReader = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; System.Xml.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlNodeReader&lt;/FONT&gt;&lt;FONT size=1&gt;(dataNode);&lt;/P&gt;
&lt;P&gt;recordDataSet.ReadXml(dataReader, System.Data.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;XmlReadMode&lt;/FONT&gt;&lt;FONT size=1&gt;.Auto);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;And we're done!&amp;nbsp; Because the FormsRecordDataSet includes its own schema, and the DataSet knows how to parse a schema in XML format, there's no need to wrestle with individual columns and their datatypes; it just drops right in.&amp;nbsp; Then when bound to the DataGridView, we see Groove data in the form.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Copy, paste, build, run.&amp;nbsp; Outlook shows my menu-button, and when I click the button, here's the form:&lt;/FONT&gt;&lt;/P&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/13-dataform.PNG"&gt; 
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Wasn't that easy?&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=454754" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Tips/default.aspx">Forms Tips</category></item><item><title>Identifying Groove Forms Tools</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/454753.aspx</link><pubDate>Fri, 09 Sep 2005 21:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:454753</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/454753.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=454753</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;The various workspace tools each have a Type, which identifies the tool:&amp;nbsp; Files, Discussion, Calendar, Forms, and so on.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The standard list of tool types in Groove V3 are:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT size=1&gt;
&lt;P&gt;urn:groove.net:platform.tools.Forms&lt;/P&gt;
&lt;P&gt;urn:groove.net:platform.tools.Files&lt;/P&gt;
&lt;P&gt;urn:groove.net:platform.tools.Discussion&lt;/P&gt;
&lt;P&gt;urn:groove.net:platform.tools.Calendar&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Within a Forms tool, the designer may also have specified a DesignName and DesignVersion; these are optional, but I'd strongly recommend you use them to label your tools.&amp;nbsp; The design name is a URN.&amp;nbsp; The design version is just a string, but I recommend choosing a "dotted numbers" format: at a minimum &amp;lt;majorversion&amp;gt;.&amp;lt;minorversion&amp;gt;.&amp;nbsp; That way, it's easy to identify releases of the same tool with compatible schemas (same major-version) or incompatible schemas (different major-version), and to write code to handle your various versions appropriately.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;I went back and added a nice long design-name, and a version number,&amp;nbsp;to the &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441808.aspx"&gt;&lt;FONT face=Arial size=2&gt;Forms tool from earlier&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/12-designname.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Now, our GWS application currently list all workspace tools in the tools combo-box.&amp;nbsp; This can easily be reduced to only display Forms tools, by checking the tool's type:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT color=#008080 size=1&gt;
&lt;P&gt;Tool&lt;/FONT&gt;&lt;FONT size=1&gt;[] tools = toolsService.Read();&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Add the tools to the combobox (unselected).&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT color=#008000 size=1&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;foreach&lt;/FONT&gt;&lt;FONT size=1&gt; (&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Tool&lt;/FONT&gt;&lt;FONT size=1&gt; t &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; tools) 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Only add the tool to the list if it's a Forms tool&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT color=#008000 size=1&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (t.Type == &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"urn:groove.net:platform.tools.Forms"&lt;/FONT&gt;&lt;FONT size=1&gt;) 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;/P&gt;
&lt;P&gt;ToolsCombo.Items.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ToolInfo&lt;/FONT&gt;&lt;FONT size=1&gt;(t));&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;We want to further restrict this to only include Forms tools with the design-name we chose.&amp;nbsp; Only those tools will have the correct schema, and the data-transfer portion of my little application will be hard-coded to only expect the fields I created in that forms tool.&amp;nbsp; The code for this is slightly more involved, because DesignName isn't a property on the Tool; it's a property on a ToolProperties class, which requires one extra web-services call to Groove.&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT color=#008080 size=1&gt;
&lt;P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#008000 size=1&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (t.Type == &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"urn:groove.net:platform.tools.Forms"&lt;/FONT&gt;&lt;FONT size=1&gt;) 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Query the forms tool to find its "design name"&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// (property set by the forms designer).&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// The contacts tool we can connect with has a known type (which we made up):&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// urn:groove.net:pdc2005.demonstration.Contacts&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;// Only add these special tools to the tools combobox.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; toolURI = t.Data;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GrooveForms&lt;/FONT&gt;&lt;FONT size=1&gt; formsService = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GrooveForms&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;formsService.GrooveRequestHeaderValue = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveFormsWebService.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GrooveRequestHeader&lt;/FONT&gt;&lt;FONT size=1&gt;();&lt;/P&gt;
&lt;P&gt;formsService.GrooveRequestHeaderValue.GrooveRequestKey = &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GWSUtil&lt;/FONT&gt;&lt;FONT size=1&gt;.GrooveLocalRequestKey;&lt;/P&gt;
&lt;P&gt;formsService.GrooveRequestHeaderValue.GrooveIdentityURL = selectedIdentity.URI;&lt;/P&gt;
&lt;P&gt;formsService.Url = &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GWSUtil&lt;/FONT&gt;&lt;FONT size=1&gt;.GrooveURL + toolURI;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ToolProperties&lt;/FONT&gt;&lt;FONT size=1&gt; tp = formsService.ReadToolProperties();&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (tp.DesignTemplateName == &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"urn:groove.net:pdc2005.demonstration.Contacts"&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ToolsCombo.Items.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;ToolInfo&lt;/FONT&gt;&lt;FONT size=1&gt;(t));&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The behaviour of our application, once this code is added, isn't really optimal:&amp;nbsp; you're presented with a list of workspaces, even those which don't contain any matching tools.&amp;nbsp; Doing this "properly" is left as an exercise to the reader :-)&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=454753" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Tips/default.aspx">Forms Tips</category></item><item><title>One more thing...</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/22/441919.aspx</link><pubDate>Fri, 22 Jul 2005 20:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:441919</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/441919.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=441919</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;The &lt;A href="http://rackham.artpassions.net/alice1.html"&gt;Rabbit&lt;/A&gt; is muttering&amp;nbsp;&lt;!--StartFragment --&gt;to itself, &lt;EM&gt;"Oh dear! Oh dear! I shall be late!"&lt;/EM&gt;, so I must press on.&amp;nbsp; So much to do.&amp;nbsp; I have to write about the Groove EDB Server next, and then Web Services, and start showing some (C#) Real Code.&amp;nbsp; I have a presentation the first week of August to cover the same ground I'm treading here and more, and this is thinking aloud.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;But I can't leave Forms behind, at this early stage, without pointing toward the scripting features which make it a powerful application builder.&amp;nbsp; (You can't (yet) integrate managed code in the Groove Forms tool user interface.&amp;nbsp; But in case you're wondering, JavaScript is Real Code too, for all its faults).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Go back into the forms designer, to modify the Contact form.&amp;nbsp; (Either select "Modify Form -&amp;gt; Contact", or "Open Design Sandbox" then select the form in the design objects tree).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/06-modifyform.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Then&amp;nbsp;"create new field..."&amp;nbsp; and select "Script Button" field type.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Make three buttons. For the first, set the OnClick script to this:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;alert( document.getElementById('FullName_Field').outerHTML );&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;FONT face=Arial size=2&gt;There's a HTML input field on the form (in edit mode -- it's slightly different in preview mode) which is called "FullName_Field", because we have a field called "FullName"; this script reaches into the form's HTML and displays the contents of that piece of the form's structure.&amp;nbsp; So, hey, the form is a web page.&amp;nbsp; There are some helper functions (&lt;FONT face="Courier New"&gt;GetHTMLFieldValue &lt;/FONT&gt;etc) to get the current value out of an input field while in edit mode, and to set values directly into these fields; documentation in the &lt;A href="http://www.groove.net/solutions/develop/docs/"&gt;Forms developer guide&lt;/A&gt; under "PublicScript Functions And Properties".&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;For the second, try this script:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;alert( GetApp().CurrentAuthorName );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;GetApp() is a helper function which gets you the Groove Forms UI Delegate (a COM component which implements IGrooveFormsToolUIDelegate) which has lots of really useful methods and properties.&amp;nbsp; For example, here, to retrieve the name of the current user.&amp;nbsp; Again, the developer guide (under GrooveFormsToolUIDelegate) has all the details.&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;For the third, this:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;alert( GetFormRecord().OpenField("FullName") );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;GetFormRecord() opens the current record (with a COM interface, IGrooveFormsToolRecord), from which you can read and write fields directly.&amp;nbsp; Note: these are different from the values displayed in the form:&amp;nbsp; if you make changes in the form, they aren't (usually) applied to the Record until you save changes.&amp;nbsp; But the record's always accessible, so if you really really want to read and write its values, you can do that at any time.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;If there's a hierarchy of&amp;nbsp;records, for example in a discussion (with "main topics" and "responses"), you can also use the Record interface to walk up and down the hierarchy.&amp;nbsp; For example, you might want to grab a field value from the topmost parent in a response hierarchy, to insert somewhere in the current form UI.&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Enough rope to be dangerous.&amp;nbsp; Two take-aways from this little segment, though.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;One: the user interface of a form is HTML -- it's actually an embedded Internet Explorer control --&amp;nbsp;and you can use all your favourite DHTML techniques on the form.&amp;nbsp; (There are lots of places to hook script into the form, and we'll cover them all in some detail, later...).&amp;nbsp; Some of our custom applications have used really sophisticated DHTML: expanding sections, hover animation, dynamic tables, popup menus, and so on.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Two: There's a big difference between the DHTML form (the "front-end") and the record which actually holds the data (the "back-end").&amp;nbsp; When you start to edit an existing record, the front-end form has its field values populated from the back-end record;&amp;nbsp; when you save, the front-end form pushes its values down into the back-end record; and in between, they are likely different.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=441919" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category></item><item><title>Contact Form and View</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/22/441808.aspx</link><pubDate>Fri, 22 Jul 2005 17:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:441808</guid><dc:creator>hpyle</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/441808.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=441808</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Back to work, then; let's make&amp;nbsp;a Contact form, with some suitable fields on it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;In the &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/21/441507.aspx"&gt;&lt;FONT face=Arial size=2&gt;last instalment&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, we were just about to add fields to a new form&amp;nbsp; So let's do that;&amp;nbsp; create a text field.&amp;nbsp; (Select field type "text" and press the "Next&amp;gt;" button, or just double-click on "text").&amp;nbsp; The first field will be "full name", so let's make that the field's label.&amp;nbsp; Note that you can edit a field's label anytime;&amp;nbsp; the label can be plaintext, or even richtext if you want particular formatting.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/05-fieldlabel.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The field &lt;STRONG&gt;name&lt;/STRONG&gt;, in this case, is quite important too; A fieldname is the internal name used for the field, and never ever changes (and you can never ever have two fields with the same name).&amp;nbsp; Field names can't contain spaces or special characters.&amp;nbsp; I chose a selection of fields (&lt;TT&gt;FirstName, LastName, FullName, JobTitle, CompanyName&lt;/TT&gt;) carefully - those field names happen to be the same as the properties of a contact in Outlook's object model, and I want to synchronize these contact forms with Outlook at some point.&amp;nbsp; So, in the properties list select "Name", and enter FullName.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/05-fieldname.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Then "finish" - let's see how this looks on the form:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/05-field1.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;OK, it's very plain;&amp;nbsp; there's a "Style" dropdown above the form in the designer, so let's choose "LightSpirit", which looks nicer while still being fairly inoffensive.&amp;nbsp; Now add the other fields too, remembering to enter the &lt;STRONG&gt;name&lt;/STRONG&gt; carefully.&amp;nbsp; (Use the "Save and Create Another" button to create lots of fields at once).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/05-field3.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Finally, save the form -- the save button is way down the bottom right.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;A Forms tool always needs at least one view, to display the records.&amp;nbsp; So, if this is your first form, a &lt;/FONT&gt;&lt;A href="http://www.cabezal.com/msdnblog/05-createview.PNG"&gt;&lt;FONT face=Arial size=2&gt;helpful popup&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; takes you into the view builder.&amp;nbsp; Here I selected only a few of the fields, and gave the view a name ("Contacts").&amp;nbsp; Note the "move up" and "move down" buttons at the right, to change the order of columns in the view.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/05-viewbuilder.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;When you're done, save the view.&amp;nbsp; Then press the &lt;A href='&lt;IMG SRC="http://www.cabezal.com/msdnblog/05-savetogroove.PNG"&gt;'&gt;"Save to Groove" button&lt;/A&gt;, which saves all our work from the "designer sandbox" and makes it available to everyone in the workspace.&amp;nbsp; Finally we have a simple form to enter people's contact data, and a view showing our of contacts.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/05-ourform.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=441808" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category></item><item><title>Forms, Fields, and Views</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/21/441507.aspx</link><pubDate>Thu, 21 Jul 2005 22:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:441507</guid><dc:creator>hpyle</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/441507.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=441507</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;The Groove Forms tool is a simple form designer.&amp;nbsp; Sometimes it &lt;EM&gt;looks&lt;/EM&gt; complex, but really the structure is quite straightforward.&amp;nbsp; Let's begin at the beginning.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;A Groove workspace contains tools, and members.&amp;nbsp; You create a workspace, you're the only member.&amp;nbsp; Then you invite another person; when they accept your invitation, a copy of the workspace is delivered to their PC, and they become a member too.&amp;nbsp; If they're given appropriate permissions, the can also invite other people.&amp;nbsp; So it grows.&amp;nbsp; Everyone has a copy of the workspace and all its contents.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Most workspaces have several tools;&amp;nbsp; tools can be added (and removed) by any member who has the appropriate permissions.&amp;nbsp; There are several tools "in the box": files, calendar, sketchpad, discussion, and so on.&amp;nbsp; (The most flexible of these is the Forms tool).&amp;nbsp; Every Groove tool is "groovey":&amp;nbsp; any action performed by any member of the workspace is automagically synchronized with all the other workspace members.&amp;nbsp; (This isn't the time and place to explain how that happens.&amp;nbsp; Another time).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The Files tool contains files.&amp;nbsp; The sketchpad tool contains sketches.&amp;nbsp; The forms tool contains, well... fields, forms, views, and records -- and these are user-defined; in other words, you can build your own forms, and make them behave the way you want, and create structured data the way you want to work with it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;When working in a forms tool, the display usually has two parts: at the top, a &lt;STRONG&gt;view&lt;/STRONG&gt; (a list of &lt;STRONG&gt;records&lt;/STRONG&gt;, displaying a selection of &lt;STRONG&gt;fields&lt;/STRONG&gt; in columns); and below, a preview of the current record, which is displaying those and other&amp;nbsp;&lt;STRONG&gt;fields&lt;/STRONG&gt; on a &lt;STRONG&gt;form&lt;/STRONG&gt;.&amp;nbsp; (This terminology is Notes-like rather than InfoPath-like; that's the way it is, for now, and I hope there's no confusion).&amp;nbsp; There are always multiple fields;&amp;nbsp; there can be one or many forms;&amp;nbsp; and there can be one or many views, each maybe selecting a different subset of the data records.&amp;nbsp; The same field can be used on more than one form, if you want;&amp;nbsp; there can't be two fields with the same fieldname.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;To build a forms tool from scratch, you usually start with a blank form, and add fields onto it right away.&amp;nbsp; (It's possible to have fields which aren't used on any form.&amp;nbsp; I don't know a good reason you would want to do that).&amp;nbsp;&amp;nbsp; Then you create at least one view.&amp;nbsp; Then you save, and all the members of your workspace can fill out your form to create records, which will be disseminated to everyone in the space.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Let's walk through building the skeleton of our contact-list tool, so you can see these pieces fit together.&amp;nbsp; Pressing that "start here" button opens the Groove Forms Designer.&amp;nbsp; (At this point, the faint-hearted will pass out.&amp;nbsp; Don't be dismayed; it's easier than it looks).&amp;nbsp; Now, I already know some of the fields I want to add to my contacts form:&lt;TT&gt;&amp;nbsp; FirstName, LastName, FullName, JobTitle, CompanyName.&amp;nbsp;&lt;/TT&gt; So change the form name to "Contact", then click "Create New Field..." in the left-hand tree.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.cabezal.com/msdnblog/03-newform-lg.PNG"&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/03-newform-sm.PNG" border=0&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Next up:&amp;nbsp; what the field types are, and we'll create those fields.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=441507" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category></item><item><title>Getting Started with Forms</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/21/441496.aspx</link><pubDate>Thu, 21 Jul 2005 22:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:441496</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/441496.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=441496</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Let's get coding.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;I want to build&amp;nbsp;a system which has Groove workspaces connected to a central system.&amp;nbsp; This'll be a framework to show the various moving parts, and code to knit them together, and hopefully building something which has at least a nominal type of realistic use.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The scenario I'm working with is this:&amp;nbsp; a Groove workspace with a contact list (and probably some other tools later - discussion, document libraries -- not sure what'll be needed yet).&amp;nbsp; But the contact list helps focus on something simple and easily achievable.&amp;nbsp; It's a nice place to start because there are two types of integration I'll try to demonstrate:&amp;nbsp; one "local", connecting the contacts list with Outlook;&amp;nbsp; one "central", connecting the contact list with either a SQLServer table or maybe a SharePoint site.&amp;nbsp; (Yet to decide that one.&amp;nbsp; I suspect probably SharePoint will be easy enough).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;To begin, then:&amp;nbsp; open Groove, create a new workspace.&amp;nbsp;&amp;nbsp; Give it a name; select "template" - "custom".&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;&lt;IMG src="http://www.cabezal.com/msdnblog/01-createworkspace.PNG"&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Then you're presented with a "More Tools" list;&amp;nbsp; check "Forms" and press OK.&amp;nbsp; The new workspace opens, with a nice splash screen saying "Start Here".&amp;nbsp; This is the Groove Forms tool.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp; &lt;IMG src="http://www.cabezal.com/msdnblog/02-newformstool.PNG"&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Now, before we start creating the forms, let's take a moment to walk through how Groove Forms is structured.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=441496" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category></item></channel></rss>