<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="RSSFeed.xsl"?>
<rss version="2.0">
     <channel>
          <title>Rob Nowiks SharePoint Blog</title>
          <description>Rob Nowiks SharePoint Blog</description>
          <link>http://rnowik.com/</link>
          <lastBuildDate>09/05/2008 15:48:00</lastBuildDate>
          <generator>Rob Nowiks Blog</generator>
          <item>
               <title>SharePoint &amp;quot;Service Unavailable&amp;quot; Error</title>
               <description>&lt;p&gt;Today I experienced an error on a VM &amp;quot;server unavailable&amp;quot; when I tried to navigate to any page on a web application. It turned out that the app pool under which the web application ran had crashed. To correct this I simply restarted the app pool in iismanager. Note that an iisreset or reboot of the vm did not restart the app pool. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I found this related article for wss2, but this seems to apply to all versions of sharepoint: &lt;a href="http://support.microsoft.com/kb/823552"&gt;http://support.microsoft.com/kb/823552&lt;/a&gt;&lt;/p&gt;</description>
               <link>http://rnowik.com/SharePoint-quot-Service-Unavailable-quot-Error.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>24/04/2008 22:05:01</pubDate>
          </item>
          <item>
               <title>Passed MCTS 70-631</title>
               <description>&lt;p&gt;I have passed exam 70-631: Windows SharePoint Services 3.0, Configuration, with a score of 1000. &lt;/p&gt;  &lt;p&gt;&lt;img height="53" alt="MCTS(rgb)_529" src="http://rnowik.com/images/MCTS(rgb)_529_thumb.jpg" width="240" /&gt;&lt;/p&gt;</description>
               <link>http://rnowik.com/Passed-MCTS-70-631.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>08/04/2008 19:21:02</pubDate>
          </item>
          <item>
               <title>ASP.NET: Writing a Custom DataControlField</title>
               <description>&lt;p&gt;I recently needed to display data in a tabular form, where all rows could be edited at once (e.g. not using the DataControlRowState.Edit functionality normally used in a gridview) If you are creating the gridview directly on an aspx page or ascx control, you can simply setup the itemtemplate for a field (e.g. to contain your custom controls):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;lt;asp:GridView ID=&amp;quot;GridView1&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateColumns=&amp;quot;false&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Columns&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:TemplateField HeaderText=&amp;quot;Name&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemTemplate&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:TextBox Runat=&amp;quot;server&amp;quot; Text='&amp;lt;%# Bind(&amp;quot;name&amp;quot;) %&amp;gt;' ID=&amp;quot;TextBox1&amp;quot;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemTemplate&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/asp:TemplateField&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Columns&amp;gt;       &lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This is only appropriate if you have a design surface (i.e. on an ascx or aspx page) and there are many cases where you need to create controls via code (e.g. when creating a control library, or a webpart). To create custom template fields programmatically, you must create a class deriving from System.Web.UI.WebControls.DataControlField. The code below gives an example (note that this also works with SPGridView):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;public class DropDownTest : DataControlField      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #region Properties       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// The name of the DataField that will be bound       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string DataField       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object dataField = ViewState[&amp;quot;DataField&amp;quot;];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&amp;#160; (dataField != null)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return dataField.ToString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return string.Empty;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ViewState[&amp;quot;DataField&amp;quot;] = value;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160; #region Overidden methods      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// Returns and instance of this field       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;DropDownTest&amp;lt;/returns&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override DataControlField CreateField()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return new DropDownTest();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// Initialise the cell and setup binding event       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;cell&amp;quot;&amp;gt;Container cell&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;cellType&amp;quot;&amp;gt;Type of cell&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;rowState&amp;quot;&amp;gt;Row state&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;rowIndex&amp;quot;&amp;gt;Row index&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.InitializeCell(cell, cellType, rowState, rowIndex);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cellType == DataControlCellType.DataCell)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DropDownList dropDown = new DropDownList();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropDown.Items.Add(&amp;quot;Not Visible&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropDown.Items.Add(&amp;quot;Date&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropDown.Items.Add(&amp;quot;Text&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropDown.Items.Add(&amp;quot;Select&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cell.Controls.Add(dropDown); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!string.IsNullOrEmpty(this.DataField) &amp;amp;&amp;amp; this.Visible)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropDown.DataBinding += new EventHandler(dropDown_DataBinding);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// Stores the cells values       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;dictionary&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;rowState&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;includeReadOnly&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public override void ExtractValuesFromCell(System.Collections.Specialized.IOrderedDictionary dictionary, DataControlFieldCell cell, DataControlRowState rowState, bool includeReadOnly)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.ExtractValuesFromCell(dictionary, cell, rowState, includeReadOnly);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string value = null; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cell.Controls.Count &amp;gt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value = ((DropDownList)cell.Controls[0]).SelectedValue;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //If the key exists, update the value      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (dictionary.Contains(this.DataField))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dictionary[this.DataField] = value;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Add a new entry to the dictionary       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dictionary.Add(this.DataField, value);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160; #region Event Handlers      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// Perform the databinding       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;Sender object&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;Event args&amp;lt;/param&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private void dropDown_DataBinding(object sender, EventArgs e)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (sender is DropDownList)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DropDownList dropDown = (DropDownList)sender;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object dataItem = DataBinder.GetDataItem(dropDown.NamingContainer);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropDown.SelectedValue = DataBinder.GetPropertyValue(dataItem, this.DataField, null);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To add a custom column your gridview, simple do the following:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;DropDownTest dropDownBound = new DropDownTest();      &lt;br /&gt;dropDownBound.DataField = &amp;quot;displayType&amp;quot;;       &lt;br /&gt;GridView1.Columns.Add(dropDownBound);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Note that you can obtain values by doing the following on a button click event or similar:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;foreach (GridViewRow row in GridView1.Rows)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string test = ((DropDownList)row.Cells[0].Controls[0]).SelectedValue;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Context.Response.Write(test);       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;</description>
               <link>http://rnowik.com/ASP-NET-Writing-a-Custom-DataControlField.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>03/04/2008 22:09:04</pubDate>
          </item>
          <item>
               <title>C#: Custom Serializable Class That Inherits From DataTable</title>
               <description>&lt;p&gt;To allow a custom type that inherits from System.Data.DataTable to be serializable,&amp;#160; you must do the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add the serializable attribute to the class. &lt;/li&gt;    &lt;li&gt;Include a namespace reference to System.Runtime.Serialization. &lt;/li&gt;    &lt;li&gt;Implement the &amp;quot;GetObjectData&amp;quot; method for the ISerializable interface. &lt;/li&gt;    &lt;li&gt;Add a constructor that takes parameters for SerializationInfo and StreamingContext (in addition to the normal constructor). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The code below illustrates. &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;namespace TestProject      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Serializable]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class MyCustomDataTable : DataTable, ISerializable       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region Constructors       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public MyCustomDataTable() : base()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public MyCustomDataTable(SerializationInfo info, StreamingContext context)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : base(info, context)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Additions to datatable etc go here &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region ISerializable Members       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.GetObjectData(info, context);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Note that my reason for requiring serialization was that webparts require saved properties to be serializable (i.e. properties decorated with attributes such as[WebBrowsable(false),&amp;#160; Personalizable(PersonalizationScope.Shared)]). &lt;/p&gt;</description>
               <link>http://rnowik.com/C-Custom-Serializable-Class-That-Inherits-From-DataTable.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>03/04/2008 20:56:05</pubDate>
          </item>
          <item>
               <title>Quicknote: Easy way to debug assemblies in the GAC</title>
               <description>&lt;p&gt;When developing assemblies that are deployed to the GAC before you can test them (as is often the case with SharePoint), simply add the location of the associated pdb file(s) to the &amp;quot;Symbol File (.pdb) Locations&amp;quot; in Tools-&amp;gt;Options-&amp;gt;Debugging-&amp;gt;Symbols within VS2005. (See attached screenshot)&lt;/p&gt;  &lt;p&gt;&lt;img height="278" alt="image" src="http://rnowik.com/images/image_thumb.png" width="470" /&gt;&lt;/p&gt;</description>
               <link>http://rnowik.com/Quicknote-Easy-way-to-debug-assemblies-in-the-GAC.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>02/04/2008 21:47:41</pubDate>
          </item>
          <item>
               <title>Note: TFS Status Search</title>
               <description>&lt;p&gt;To view all checked out files on your TFS search, open as VS2005/8 command prompt and run the following command:&lt;/p&gt;  &lt;p&gt;tf status /s:MyTFSServerName /u:* &lt;/p&gt;  &lt;p&gt;Unless I'm missing something, there doesn't seem to be a way of doing this through the Team Explorer (previously, you could just click &amp;quot;view-&amp;gt;search-&amp;gt;status search&amp;quot; in SourceSafe 6). &lt;/p&gt;</description>
               <link>http://rnowik.com/Note-TFS-Status-Search.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>01/04/2008 21:06:22</pubDate>
          </item>
          <item>
               <title>Passed MCTS 70-541</title>
               <description>&lt;p&gt;I have just taken and passed the &amp;quot;MCTS: Microsoft Windows SharePoint Services 3.0 - Application Development&amp;quot; exam&lt;/p&gt;  &lt;p&gt;&lt;img height="80" alt="MCTS(rgb)_525" src="http://rnowik.com/images/PassedMCTS70541_113B3/MCTSrgb_525_thumb.gif" width="368" /&gt;&lt;/p&gt;</description>
               <link>http://rnowik.com/Passed-MCTS-70-541.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>20/03/2008 19:36:32</pubDate>
          </item>
          <item>
               <title>C#: Suppressing Certificate Errors in Code</title>
               <description>&lt;p&gt;Normally when access a page over ssl via a browser, you will get a dialog box asking if you wish to proceed if there are any certificate errors. If, however, you are calling the code via the object model, you do not get prompted - instead an exception is thrown. To mitigate for this, it is possible to specify a delegate method to validate certificates - the example below ignores all certificate errors (requires a reference to the System.Security.Cryptography.X509Certificates namespace to match the delegate signature): &lt;br&gt;&lt;code&gt;&lt;br&gt;public static bool TrustAllCertsValidate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)&lt;br&gt;{&lt;br&gt;return true;&lt;br&gt;}&lt;br&gt;&lt;/code&gt;&lt;br&gt;To use this and ignore certificate errors, add a reference to the System.Net namespace and add the following line before accessing your web resource (e.g. web service). &lt;br&gt;&lt;code&gt;&lt;br&gt;ServicePointManager.ServerCertificateValidationCallback += TrustAllCertsValidate;&lt;/code&gt;&lt;/p&gt;</description>
               <link>http://rnowik.com/C-Suppressing-Certificate-Errors-in-Code.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>11/03/2008 18:42:50</pubDate>
          </item>
          <item>
               <title>C#: Using Trace Levels</title>
               <description>&lt;p&gt;To add levels of tracing into an application, that generate differing levels of output based on a setting in your applications config file, simply add a switch to the system.diagnostic node of your config file (create the system.diagnostics node if it doesnt exist). Set the value of this switch to the level of trace required (0-4). &lt;br&gt;&lt;code&gt;&lt;br&gt;&amp;lt;configuration&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;system.diagnostics&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;switches&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;lt;add name="MyTraceSwitch" value="4" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/switches&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/system.diagnostics&amp;gt;&lt;br&gt;&amp;lt;/configuration&amp;gt;&lt;br&gt;&lt;/code&gt;&lt;br&gt;To write trace output using that switch, simply create a TraceSwitch object that references the switch in your config file. Note that this will subsequently contain boolean properties that reflect your trace value specified in your config switch. Note that if your config file does not contain the reference switch, all of these values will be set to false (i.e. tracing will be turned off). &lt;br&gt;You can then simply perform a Trace.WriteLineIf based on these properties. &lt;br&gt;&lt;code&gt;&lt;br&gt;TraceSwitch traceSwitch = new TraceSwitch("MyTraceSwitch", "My Trace Switch");&lt;br&gt;Trace.WriteLineIf(traceSwitch.TraceError, "ERROR: hello world");&lt;br&gt;Trace.WriteLineIf(traceSwitch.TraceWarning, "WARNING: hello world");&lt;br&gt;Trace.WriteLineIf(traceSwitch.TraceInfo, "INFO: hello world");&lt;br&gt;Trace.WriteLineIf(traceSwitch.TraceVerbose, "VERBOSE: hello world");&lt;br&gt;&lt;/code&gt;&lt;br&gt;To capture output, add a tracelistener or use software such as debugview.&lt;/p&gt;</description>
               <link>http://rnowik.com/C-Using-Trace-Levels.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>11/03/2008 18:42:27</pubDate>
          </item>
          <item>
               <title>Passed MCTS 70-630</title>
               <description>&lt;p&gt;I have just taken and passed the "MCTS: Microsoft Office SharePoint Server 2007 - Configuration" exam&lt;/p&gt;</description>
               <link>http://rnowik.com/Passed-MCTS-70-630.aspx</link>
               <author>Rob Nowik</author>
               <pubDate>06/03/2008 18:42:01</pubDate>
          </item>
     </channel>
</rss>