<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.inetium.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>Vince Bullinger</title><link>http://blogs.inetium.com/blogs/vbullinger/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Putting Custom Text on a Google Maps Marker Image</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2009/01/22/putting-custom-text-on-a-google-maps-marker-image.aspx</link><pubDate>Thu, 22 Jan 2009 20:48:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:20341</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>If you&amp;#39;ve ever done anything with Google Maps, you may have dabbled with custom icons. For example, you can have the default image of http://www.google.com/mapfiles/marker.png by not supplying a custom image. Or, if you&amp;#39;ve ever done a search on...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2009/01/22/putting-custom-text-on-a-google-maps-marker-image.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=20341" width="1" height="1"&gt;</description><enclosure url="http://blogs.inetium.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.02.03.41/ImageCreator.zip" length="3322" type="application/x-zip-compressed" /></item><item><title>Validation for CheckBoxLists</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2009/01/21/validation-for-checkboxlists.aspx</link><pubDate>Wed, 21 Jan 2009 22:11:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:20296</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>Apparently, you are not allowed to attach validators to CheckBoxLists. Not allowing them to be attached to CheckBoxes kind of makes sense, because how do you validate a &amp;quot;no&amp;quot; response? Although, I think they should be validatable, too, because...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2009/01/21/validation-for-checkboxlists.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=20296" width="1" height="1"&gt;</description></item><item><title>MDC Development Conference Wrap-Up</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2009/01/15/mdc-development-conference-wrap-up.aspx</link><pubDate>Thu, 15 Jan 2009 17:08:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:19960</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>On Tuesday, the 12th, I went to the MSDN Developer&amp;#39;s Conference: http://www.msdndevcon.com/Pages/Minneapolis.aspx . It was quite a good deal at just $99! Especially since Inetium picked up the tab I went with Erik O&amp;#39;Leary, but Justin Vogt, Eric...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2009/01/15/mdc-development-conference-wrap-up.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=19960" width="1" height="1"&gt;</description></item><item><title>Disabling All CRM Form Fields</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2008/12/23/disabling-all-crm-form-fields.aspx</link><pubDate>Tue, 23 Dec 2008 15:29:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:19096</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>I was recently asked to disable all fields on a CRM form if certain conditions were met. At first, I though &amp;quot;Eww! I&amp;#39;m going to have to type 500 lines of code&amp;quot; like the following: crmForm.all.customerid.Disabled = true; crmForm.all.name.Disabled...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2008/12/23/disabling-all-crm-form-fields.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=19096" width="1" height="1"&gt;</description></item><item><title>VS Live Conference: Day Two</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2008/09/09/vs-live-conference-day-two.aspx</link><pubDate>Wed, 10 Sep 2008 02:26:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:18299</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>Day two of the VS Live conference is over, as is another day of lectures. Again, I attended a lot of lectures on WPF and Silverlight all day. In the evening, though, I sat in on a lecture on the new .Net MVC Framework. I was interested in seeing what...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2008/09/09/vs-live-conference-day-two.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=18299" width="1" height="1"&gt;</description></item><item><title>VS Live Conference: Day One</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2008/09/08/vs-live-conference-day-one.aspx</link><pubDate>Tue, 09 Sep 2008 02:55:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:18283</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>Well, the first day of the VS Live conference has finished, and Ben and I have been in lectures all day. Ben was sitting in on lectures on LINQ and similar topics all day, I believe. Haven&amp;#39;t touched base with him since the lectures ended, though,...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2008/09/08/vs-live-conference-day-one.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=18283" width="1" height="1"&gt;</description></item><item><title>Cleaning Your Database After a SQL Injection Attack</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2008/08/04/cleaning-your-database-after-a-sql-injection-attack.aspx</link><pubDate>Mon, 04 Aug 2008 17:05:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:18075</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>If you have an older website that doesn&amp;#39;t have the top-notch security that most Inetium websites have, you may be vulnerable to a SQL injection attack. I wrote a SQL script to clean up a database that has been hit with a SQL injection attack. It goes...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2008/08/04/cleaning-your-database-after-a-sql-injection-attack.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=18075" width="1" height="1"&gt;</description></item><item><title>Copying Files from the GAC</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2008/06/04/copying-files-from-the-gac.aspx</link><pubDate>Wed, 04 Jun 2008 22:29:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:17829</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><description>We&amp;#39;ve all installed files in the GAC before, (right?) but how do you copy files FROM the GAC? I found a lot of little things here and there while Googling it, but nothing about copying a lot of files. I needed to copy a bunch of files and copying...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2008/06/04/copying-files-from-the-gac.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=17829" width="1" height="1"&gt;</description><category domain="http://blogs.inetium.com/blogs/vbullinger/archive/tags/xcopy/default.aspx">xcopy</category><category domain="http://blogs.inetium.com/blogs/vbullinger/archive/tags/GAC/default.aspx">GAC</category></item><item><title>Modifying Queue Views in CRM</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2007/10/18/modifying-queue-views-in-crm.aspx</link><pubDate>Thu, 18 Oct 2007 21:46:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:7559</guid><dc:creator>vbullinger</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=7559</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2007/10/18/modifying-queue-views-in-crm.aspx#comments</comments><description>I was recently asked to change the queue views for a client. At first I thought, "hey, wait a tic... that's just a normal view that any old CRM customizer can modify, right?" And went directly to the customizations... No luck. Apparently, they don't want...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2007/10/18/modifying-queue-views-in-crm.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=7559" width="1" height="1"&gt;</description></item><item><title>Adding Transparency to SWFObjects</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2007/08/09/adding-transparency-to-swfobjects.aspx</link><pubDate>Thu, 09 Aug 2007 20:46:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:4768</guid><dc:creator>vbullinger</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=4768</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2007/08/09/adding-transparency-to-swfobjects.aspx#comments</comments><description>I was asked to add a lot of Flash to a website recently. This website was a content-managed solution (our own content management solution), so I thought "hey, instead of them asking me to add flash movies everywhere, why not allow them to do so, very...(&lt;a href="http://blogs.inetium.com/blogs/vbullinger/archive/2007/08/09/adding-transparency-to-swfobjects.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=4768" width="1" height="1"&gt;</description></item><item><title>CRM JScript Bug</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2007/07/30/crm-jscript-bug.aspx</link><pubDate>Mon, 30 Jul 2007 22:45:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:4516</guid><dc:creator>vbullinger</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=4516</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2007/07/30/crm-jscript-bug.aspx#comments</comments><description>&lt;P&gt;Sure, we all know how to write comments in JavaScr... I mean "JScript" - you just put this before your one-line comment: //.&amp;nbsp; Well, recently, I had a strange problem with some JScript.&amp;nbsp; I knew it was 100% correctly written, but it was throwing errors, saying I was missing an end bracket - }.&amp;nbsp; Weird, I thought, as I closed all my if/else statements and all my functions that I defined, (you know how to do that in CRM, right?&amp;nbsp; crmForm.MyFunctionName = MyFunctionName(){//stuff} and then you can use it throughout the rest of that same form's events - even on field events - by saying crmForm.MyFunctionName().) so I was really in a quandary.&amp;nbsp; I looked at the last line in my event handler, and it was a comment.&amp;nbsp; I.e.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;// The previous line did whatever&lt;/P&gt;
&lt;P&gt;So, I moved that comment above the aforementioned line, and it worked!&lt;/P&gt;
&lt;P&gt;So, what's the bug mentioned in the title?&amp;nbsp; &lt;STRONG&gt;You can't end your JScript event handlers with a comment, even if it's at the end of a line of code.&lt;/STRONG&gt;&amp;nbsp; I.e. this is illegal:&lt;/P&gt;
&lt;P&gt;alert("Hello, world!");&lt;BR&gt;// Say hello to the world&lt;/P&gt;
&lt;P&gt;As is this:&lt;/P&gt;
&lt;P&gt;alert("Hello, world!"; // Say hello to the world&lt;/P&gt;
&lt;P&gt;Just say this:&lt;/P&gt;
&lt;P&gt;// Say hello to the world&lt;BR&gt;alert("Hello, world!");&lt;/P&gt;
&lt;P&gt;Pretty lame, I know, but it should save some readers some headaches.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=4516" width="1" height="1"&gt;</description></item><item><title>IFrame Print Styles In CRM</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2007/06/11/iframe-print-styles-in-crm.aspx</link><pubDate>Mon, 11 Jun 2007 21:55:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:3151</guid><dc:creator>vbullinger</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=3151</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2007/06/11/iframe-print-styles-in-crm.aspx#comments</comments><description>&lt;P&gt;I've written a few IFrames to help extend CRM in the past, but recently, an issue with them was brought to my attention that no one had ever mentioned to me (and, therefore, I'd assume that no client had ever complained about, either).&lt;/P&gt;
&lt;P&gt;A client had tried to print a page that had an IFrame I developed on it.&amp;nbsp; Instead of whatever was in the IFrame, there was nothing.&amp;nbsp; I.e. my IFrame was hidden.&amp;nbsp; Immediately, I realized that IFrames must be hidden in CRM.&amp;nbsp; Whether on purpose or by accident (on Microsoft's part), I had to get this resolved.&amp;nbsp; All my hard work was being hidden by CRM!&lt;/P&gt;
&lt;P&gt;So I parsed through the myriad of pages and style sheets that CRM installs on the server, looking for how it interprets IFrames, and found this in one of the style sheets:&lt;/P&gt;
&lt;P&gt;IFRAME.custom&lt;BR&gt;{&lt;BR&gt;width:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100%;&lt;BR&gt;height:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100%;&lt;BR&gt;border:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1px solid #7b9ebd;&lt;BR&gt;behavior:&amp;nbsp;&amp;nbsp;&amp;nbsp;url(/_forms/controls/IFRAME.htc);&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;All IFrames&amp;nbsp;get the class "custom" by default.&amp;nbsp; So, all I had to do was&amp;nbsp;go into the print style sheet and put something&amp;nbsp;awfully similar:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;IFRAME.custom&lt;BR&gt;{&lt;BR&gt;width:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100%;&lt;BR&gt;height:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;30px;&lt;BR&gt;border:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1px solid #7b9ebd;&lt;BR&gt;behavior:&amp;nbsp;&amp;nbsp;&amp;nbsp;url(/_forms/controls/IFRAME.htc);&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;I had to give it a height, because it seems to make the height 0% or 0px, though I don't know where that's defined.&amp;nbsp; Of course, you'll want to put new, print-oriented styles in your style sheet you use for the IFrame.&amp;nbsp; For this IFrame, I was creating what looked like a lookup for contacts, so I had these styles (yours may vary):&lt;/P&gt;
&lt;P&gt;input&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;font-family: Tahoma;&lt;BR&gt;&amp;nbsp;font-size: 11px;&lt;BR&gt;&amp;nbsp;border-color: White;&lt;BR&gt;&amp;nbsp;border-width: 0px;&lt;BR&gt;&amp;nbsp;color: Black;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;DIV.lu&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;height:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0px;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;TABLE.lu&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;height:&amp;nbsp;0px;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;IMG.lu&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;height:&amp;nbsp;0px;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;This will set the linked text (the contact's name) to black, the search button to being invisible and all the other stuff surrounding the search button to being invisible.&amp;nbsp; You don't want it to looked like a linked text box, you want it to look like plain, black text.&lt;/P&gt;
&lt;P&gt;It doesn't recognize "media='print'" in your style sheet reference, btw, so you'll have to do something like I did:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script type='text/javascript'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var parentLocation = '' + window.parent.location + ''&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(parentLocation.indexOf('/print/') &amp;gt;= 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // CSSReference is your &amp;lt;link&amp;gt; tag to your style sheet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cssReference = document.getElementById('CSSReference');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(cssReference != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cssReference.href = "MyStyleSheetForPrinting.css";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;/P&gt;
&lt;P&gt;So, from now on, when you make an IFrame in CRM, you should consider all of this or your IFrames will not print at all.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=3151" width="1" height="1"&gt;</description></item><item><title>Search Engine Friendly Query Strings</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2007/01/23/819.aspx</link><pubDate>Tue, 23 Jan 2007 17:11:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:819</guid><dc:creator>vbullinger</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=819</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2007/01/23/819.aspx#comments</comments><description>&lt;P&gt;I recently was asked to develop something for a client that seemed a little ill-conceived.&amp;nbsp; This is a very particular client&amp;nbsp;who is very involved with his work.&amp;nbsp; He knows exactly what he wants and is very organized.&amp;nbsp; Usually, I just assume he's got the right idea and code away.&amp;nbsp; He seems like a pretty savvy business man.&amp;nbsp; But this time, it was a bit different.&amp;nbsp; I felt there was a better way.&lt;/P&gt;
&lt;P&gt;He wanted to have a list of products he could manage through our content management system and link each product to a different webpage where he would add content through the same content management system about the product.&amp;nbsp; Each product would have its own page.&amp;nbsp; Ew.&lt;/P&gt;
&lt;P&gt;I told the project manager that it would be better if we just had one page for the categories and one page for the products.&amp;nbsp; You would pass an id of the category into a query string for the category page and a&amp;nbsp;product id into a a query string for the product page.&amp;nbsp; Much easier for the client.&amp;nbsp; The project manager told me that the client didn't care about things like that because he was more concerned about search engine results than his time.&amp;nbsp; I replied by saying that it didn't matter: search engines crawl dynamic URLs on pages.&amp;nbsp; The project manager wasn't too certain, and I wasn't really an "expert" on the subject, either, so I kind of tabled the decision and decided to look it up a bit.&lt;/P&gt;
&lt;P&gt;The very first page I found, located &lt;A href="http://www.smart-it-consulting.com/article.htm?node=140&amp;amp;page=53" target=_blank&gt;here&lt;/A&gt;,&amp;nbsp;explained it really well.&amp;nbsp; The article states that, though search engine spiders do crawl through sites, they have some serious - and very understandable - limitations.&amp;nbsp; The synopsis of the important points about query strings are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Keep them short. Less variables gain more visibility. 
&lt;LI&gt;Keep your variable names short, but do not use 'ID' or composites of entities and 'ID'. 
&lt;LI&gt;Hide user tracking from search engine crawlers in all URLs appearing in (internal) links. That's tolerated cloaking, because it helps search engines. Ensure to output useful default values when a page gets requested without a session ID and the client does not accept cookies. 
&lt;LI&gt;Keep the values short. If you can, go for integers. Don't use UUIDs/GUIDs and similar randomly generated stuff in query strings if you want the page indexed by search engines. Exception: in forms enabling users to update your database use GUIDs/UUIDs only, because integers encourage users to play with them in the address bar, which leads to unwanted updates and other nasty effects.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;These are pretty important rules I'll remember for all my consulting days.&amp;nbsp; The website, &lt;A href="http://www.smart-it-consulting.com/"&gt;http://www.smart-it-consulting.com/&lt;/A&gt;, sounds like a pretty nice site for us consultants to check out in general&amp;nbsp;:)&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=819" width="1" height="1"&gt;</description></item><item><title>Accessing Parent DataItem of a Child DataItem</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2006/12/01/574.aspx</link><pubDate>Fri, 01 Dec 2006 16:18:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:574</guid><dc:creator>vbullinger</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=574</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2006/12/01/574.aspx#comments</comments><description>&lt;P&gt;We've all iterated through some kind of repeater (datalist, datagrid, an ACTUAL repeater) and used the DataBinder to display a property of the object bound to the current DataItem without wasting time writing an ItemDataBound event handler:&lt;/P&gt;
&lt;P&gt;&amp;lt;asp:Repeater&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ItemTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;%#DataBinder.Eval(Container.DataItem, "PropertyName")%&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemTemplate&amp;gt;&lt;BR&gt;&amp;lt;/asp:Repeater&amp;gt;&lt;/P&gt;
&lt;P&gt;But have you ever been iterating through a Repeater WITHIN a Repeater and wondered: "gee, how do I access the outer DataItem for display within the inner DataItem's template without writing a complicated&amp;nbsp;ItemDataBound event handler?"&amp;nbsp; I.e.&lt;BR&gt;&lt;BR&gt;&amp;lt;asp:Repeater ID="_outerRepeater"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ItemTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;%#DataBinder.Eval(Container.DataItem, "PropertyName")%&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:Repeater ID="_innerRepeater"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ItemTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Outer Repeater DataItem]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;%#DataBinder.Eval(Container.DataItem, "PropertyName")%&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/asp:Repeater&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemTemplate&amp;gt;&lt;BR&gt;&amp;lt;/asp:Repeater&amp;gt;&lt;/P&gt;
&lt;P&gt;Well, I wondered just that the other day.&amp;nbsp; I asked around to see if there was a shortcut anybody around inetium knew, to no avail.&amp;nbsp; Seems everyone thought it should be easy, but they had never thought to attempt it before.&amp;nbsp; Googling was a bit challenging for this task (what would you put in the search box?), so I begain tinkering in code, using asp.net 2.0 in Visual Studio 2005 for increased intellisense and figured out this solution:&lt;/P&gt;
&lt;P&gt;&amp;lt;asp:Repeater ID="_outerRepeater"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ItemTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;%#DataBinder.Eval(Container.DataItem, "PropertyName")%&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:Repeater ID="_innerRepeater"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ItemTemplate&amp;gt;&lt;BR&gt;&amp;lt;%#((System.Web.UI.WebControls.RepeaterItem)Container.Parent.Parent).DataItem%&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;%#DataBinder.Eval(Container.DataItem, "PropertyName")%&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/asp:Repeater&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemTemplate&amp;gt;&lt;BR&gt;&amp;lt;/asp:Repeater&amp;gt;&lt;/P&gt;
&lt;P&gt;The container is what holds the DataItem (in an event handlers, that'd be e.Item I'd guess) and it's parent is the inner repeater.&amp;nbsp; So you'll need the inner repeater's parent, the outer repeater's DataItem.&amp;nbsp; Seems to call the ToString() method of it, so it's limited, but that's exactly what I wanted (I was binding the outer repeater do directories and the inner repeater to files inside of that directory, so the point was to get a link to [Directory Name]/[File Name].&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=574" width="1" height="1"&gt;</description></item><item><title>Writing A CRM Callout Assembly: A How To</title><link>http://blogs.inetium.com/blogs/vbullinger/archive/2006/10/23/417.aspx</link><pubDate>Mon, 23 Oct 2006 19:19:00 GMT</pubDate><guid isPermaLink="false">7346ef18-9fb1-4a4e-be41-9add5078176c:417</guid><dc:creator>vbullinger</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.inetium.com/blogs/vbullinger/rsscomments.aspx?PostID=417</wfw:commentRss><comments>http://blogs.inetium.com/blogs/vbullinger/archive/2006/10/23/417.aspx#comments</comments><description>&lt;P&gt;I was recently asked to write a callout assembly to be attached to a client's CRM workflow service.&amp;nbsp; A callout assembly (in this regard) is an assembly that is attached to the CRM workflow service and is sort of like an external event handler.&amp;nbsp; So when someone adds/updates/deletes records in CRM, the callout assembly is fired.&amp;nbsp; I had never done it before, but I thought it wouldn't be too much of a problem.&amp;nbsp; There are some samples in the CRMSDK and I was sure that searching on Google and MSDN would yield the answers to any questions I'd have.&amp;nbsp; I was wrong.&lt;/P&gt;
&lt;P&gt;There isn't too much help in either of those two sources, as I found out the hard way.&amp;nbsp; This possibly isn't the most common thing in the world to do, I'm guessing.&lt;/P&gt;
&lt;P&gt;The problem I had with the "readme"s in the callout samples given in the CRMSDK is that they just blindly say "do this" and "do that," without any explanation of what's going on.&amp;nbsp; They also missed a step, as far as I can see.&amp;nbsp; They don't explain the callout.config.xml file at all.&amp;nbsp; I'll attempt to explain things, step-by-step, since I don't really see a definitive explanation of how these callout assemblies work anywhere (I've seen similar posts on other blog sites with less information, however).&lt;/P&gt;
&lt;P&gt;Step 1: create a blank solution with a class library project inside.&lt;/P&gt;
&lt;P&gt;Step 2: add a web reference to your CRM web service.&amp;nbsp; It should look something like this: http://&amp;lt;yourserver&amp;gt;/mscrmservices/2006/CrmService.asmx,&amp;nbsp;as the readme got correct.&amp;nbsp; If you need to login, you better have all that information handy, as you'll need it later.&amp;nbsp; This information will include: a) user name&amp;nbsp;b) password c) domain d) CRM server.&lt;/P&gt;
&lt;P&gt;Step 3: add a reference to the Microsoft.Crm.Platform.Callout.Base.dll file.&amp;nbsp; If you need to download that, you should do so.&amp;nbsp; I had to.&amp;nbsp; This is necessary for the next step.&lt;/P&gt;
&lt;P&gt;Step 4: create a class for your callout that extends the CrmCalloutBase class.&amp;nbsp; You will need the dll from the previous step to do this.&amp;nbsp; Make sure this class has "using Microsoft.Crm.Callout;" in the using directives for the base class and "using &amp;lt;yourassemblyname&amp;gt;.&amp;lt;yourwebreferencename&amp;gt;;" for the web service.&amp;nbsp; If you are ever going to need to connect to the web server (say, if a child object is updated/added/deleted, the parent needs to update its information, for example), then you'll need the user name, password, domain and CRM server information from before.&amp;nbsp; You'll need this code to access the CRM web service:&lt;/P&gt;
&lt;P&gt;CrmService service = new CrmService();&lt;BR&gt;service.Url = &amp;lt;CRM_SERVER&amp;gt; + "crmservice.asmx";&lt;BR&gt;service.PreAuthenticate = true;&lt;BR&gt;service.Credentials = new NetworkCredential(&amp;lt;CRM_USER&amp;gt;, &amp;lt;CRM_PASSWORD&amp;gt;, &amp;lt;CRM_DOMAIN&amp;gt;);&lt;BR&gt;WhoAmIRequest userRequest = new WhoAmIRequest();&lt;BR&gt;WhoAmIResponse userResponse = (WhoAmIResponse)service.Execute(userRequest);&lt;/P&gt;
&lt;P&gt;And your service is now ready to use.&amp;nbsp; I.e. if a child's information is edited, you may want to use the web service to update the parent.&amp;nbsp; This may be the whole reason for creating a callout assembly.&lt;/P&gt;
&lt;P&gt;Step 5: decide what events you want to listen into.&amp;nbsp; Do you want to react to whenever a case is submitted?&amp;nbsp; Do you want to react to whenever someone updates their contact information?&amp;nbsp; Do you want to check submitted information before it gets submitted?&amp;nbsp; Whatever it is, there are plenty of things to listen into.&amp;nbsp; To find out what you can listen to, inside your class, start a new line (with intellisense enabled) and type override and then a space to see what possibilities you have.&amp;nbsp; For quick reference, there's pre- and post-:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Create&lt;/LI&gt;
&lt;LI&gt;Update&lt;/LI&gt;
&lt;LI&gt;Delete&lt;/LI&gt;
&lt;LI&gt;Assign&lt;/LI&gt;
&lt;LI&gt;Set state&lt;/LI&gt;
&lt;LI&gt;MergePersonally&lt;/LI&gt;
&lt;LI&gt;PreSend&lt;/LI&gt;
&lt;LI&gt;PostDeliver&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Step 6: implement the code you want to fire when your event is triggered.&amp;nbsp; You can override a bunch of methods (all of them, actually) in the same callout class, so feel free.&amp;nbsp; I overrode three in mine.&amp;nbsp; I don't quite understand why the entity context is passed, as you can set your event to only listen for when an event is fired for an entity of a particular type.&amp;nbsp; I personally don't have any code in my callout I just wrote that worries about what type of entity I'm dealing with.&lt;/P&gt;
&lt;P&gt;Step 7: create the callout.config.xml file.&amp;nbsp; Assuming you're using CRM 3.0, you should have this line of code as your second line of code instead of the ones in the CRMSDK samples: "&amp;lt;callout.config version="3.0" xmlns=" http://schemas.microsoft.com/crm/2006/callout/"&amp;gt;" or your config file might not be recognized.&amp;nbsp; Inside the callout config file, you'll need a &amp;lt;callout&amp;gt; node for each event/entity combination you are listening into that looks like this: &amp;lt;callout entity="myentityname" event="Post/Pre&amp;lt;see above bulleted list for ideas&amp;gt;"&amp;gt; with an optional onerror property with the value of "abort" or "ignore."&amp;nbsp; Inside this node, you'll need a subscription node that looks something like this: &amp;lt;subscription assembly="myassembly.dll" class="myfullnamespace.myclass(from step four)"&amp;gt;.&amp;nbsp; Inside this node, you'll need one or more &amp;lt;postvalue&amp;gt; nodes IF you are listening in on a "Post" event (not a "Pre" event).&amp;nbsp; Each of these &amp;lt;postvalue&amp;gt; nodes needs to have the name of a property of the entity you are going to work with in your code.&amp;nbsp; For example, if you working with an incident entity and want to look at the ticket number in your callout assembly's class, you'll need this inside your subscription node: &amp;lt;postvalue&amp;gt;ticketnumber&amp;lt;/postvalue&amp;gt;.&amp;nbsp; One short cut, if you're going to use a lot of properties, or an expanding number of properties (in case your assembly will be modified as time goes on) or if you're just really lazy is to put this in your subscription: &amp;lt;postvalue&amp;gt;@all&amp;lt;/postvalue&amp;gt;, and you'll then get all of the properties.&amp;nbsp; That's what I did.&amp;nbsp; Mainly because I knew that the objects don't have a lot of properties.&amp;nbsp; I would also suggest writing to a log file throughout your code so you can debug more easily.&lt;/P&gt;
&lt;P&gt;Step 8: compile your code and attach it.&amp;nbsp; Attaching it is pretty tricky, so make sure you pay close attention.&amp;nbsp; I am not sure you'll need to do all of these things, but I did, so here's what should work for sure.&amp;nbsp; First, go into the services console (of the CRM server...)&amp;nbsp;and stop the Microsoft CRM Workflow Service.&amp;nbsp; Next, if you've already deployed a previous version of your callout assembly, RENAME IT.&amp;nbsp; It won't let you delete it, but you can rename it...&amp;nbsp; Then, move (the new version of) your callout assembly to the \Program Files\Microsoft CRM\Server\bin\assembly folder.&amp;nbsp; Then, restart IIS.&amp;nbsp; I'll wait...&amp;nbsp; Ok, now start the Microsoft CRM Workflow Service.&amp;nbsp; Delete the old assembly (the one you renamed) if this isn't the first time you deployed it.&amp;nbsp; IF YOU MAKE ANY CHANGES TO THE DLL OR THE CALLOUT.CONFIG.XML FILE(S), YOU MUST REPEAT STEP 8 OR IT WON'T TAKE EFFECT!&lt;/P&gt;
&lt;P&gt;That should do it!&amp;nbsp; Now, if you have trouble getting into the workflow or think it's too restrictive/not powerful enough, you can write C# code (or VB code, if you are so inclined) that can do whatever you want and then just attach it to the workflow process using the process outlined above.&amp;nbsp; Happy calling out!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.inetium.com/aggbug.aspx?PostID=417" width="1" height="1"&gt;</description></item></channel></rss>