<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/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>Web Dev And Stuff : C#</title><link>http://weblogs.asp.net/johnkatsiotis/archive/tags/C_2300_/default.aspx</link><description>Tags: C#</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Make your site run only in ONE Browser window(single instance)!</title><link>http://weblogs.asp.net/johnkatsiotis/archive/2009/11/15/make-your-site-run-only-in-one-browser-window-single-instance.aspx</link><pubDate>Sun, 15 Nov 2009 10:49:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7255370</guid><dc:creator>djsolid</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/johnkatsiotis/rsscomments.aspx?PostID=7255370</wfw:commentRss><comments>http://weblogs.asp.net/johnkatsiotis/archive/2009/11/15/make-your-site-run-only-in-one-browser-window-single-instance.aspx#comments</comments><description>
&lt;p&gt;While a was at Teched2009 and watching Tim Heuer presenting Silverlight 3 I noticed a new cool feature named Local Messaging! &lt;/p&gt;
  
&lt;p&gt;When I saw this new feature, a crazy idea crossed my mind. Could this be used in order to allow the user to open my website in only one browser window?&lt;/p&gt;
  
&lt;p&gt;The answer is yes! But not the way I first thought. Here is how (code in MainPage.xaml.cs):&lt;/p&gt;
  &lt;div style="border: 1px solid silver; margin: 20px 0px 10px; padding: 4px; overflow: auto; text-align: left; line-height: 12pt; background-color: rgb(244, 244, 244); width: 97.5%; font-family: 'Courier New',courier,monospace; direction: ltr; max-height: 200px; font-size: 8pt; cursor: text;" id="codeSnippetWrapper"&gt;   
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;" id="codeSnippet"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; _localName = &lt;span style="color: rgb(0, 96, 128);"&gt;"SL App"&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;bool&lt;/span&gt; _Close = &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; MainPage()&lt;br&gt;{&lt;br&gt;   InitializeComponent();&lt;br&gt;&lt;br&gt;   Loaded += &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; RoutedEventHandler(MainPage_Loaded);&lt;br&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;try&lt;/span&gt;&lt;br&gt;   {&lt;br&gt;       LocalMessageReceiver incomingMessage = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; LocalMessageReceiver(_localName);&lt;br&gt;       &lt;span style="color: rgb(0, 128, 0);"&gt;//Start listening&lt;/span&gt;&lt;br&gt;       incomingMessage.Listen();&lt;br&gt;   }&lt;br&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;catch&lt;/span&gt; (ListenFailedException)&lt;br&gt;   {&lt;br&gt;       _Close = &lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;;&lt;br&gt;   }            &lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; MainPage_Loaded(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br&gt;{&lt;br&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (_Close)&lt;br&gt;   {&lt;br&gt;       HtmlPage.Window.SetProperty(&lt;span style="color: rgb(0, 96, 128);"&gt;"location"&lt;/span&gt;, &lt;span style="color: rgb(0, 96, 128);"&gt;"/InfoMessage.aspx"&lt;/span&gt;);&lt;br&gt;   }&lt;br&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;&lt;br&gt;   {&lt;br&gt;       LocalMessageSender msgSender = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; LocalMessageSender(_localName);&lt;br&gt;       msgSender.SendAsync(&lt;span style="color: rgb(0, 96, 128);"&gt;"New instance loaded"&lt;/span&gt;);&lt;br&gt;   }&lt;br&gt;}&lt;/pre&gt;
  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;Loading Default.aspx&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/johnkatsiotis/image_401E0BA8.png" mce_href="http://weblogs.asp.net/blogs/johnkatsiotis/image_401E0BA8.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_0960B0A4.png" style="border-width: 0px; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_0960B0A4.png" border="0" height="255" width="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the first link 
  &lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/johnkatsiotis/image_75671E0D.png" mce_href="http://weblogs.asp.net/blogs/johnkatsiotis/image_75671E0D.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_539B457C.png" style="border-width: 0px; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_539B457C.png" border="0" height="297" width="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Then on the second link&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/johnkatsiotis/image_1CDDEA78.png" mce_href="http://weblogs.asp.net/blogs/johnkatsiotis/image_1CDDEA78.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_5AF70529.png" style="border-width: 0px; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_5AF70529.png" border="0" height="281" width="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Those are the files in the solution&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/johnkatsiotis/image_5FF942D8.png" mce_href="http://weblogs.asp.net/blogs/johnkatsiotis/image_5FF942D8.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_175F5407.png" style="border-width: 0px; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/johnkatsiotis/image_thumb_175F5407.png" border="0" height="294" width="294"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;That’s an exception driven solution but works for me! :) &lt;/p&gt;

&lt;p&gt;This works also across different browsers but if you want you can changed to allow one instance per browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://john.katsiotis.com/samples/SingletonWebAppManager.zip" mce_href="http://john.katsiotis.com/samples/SingletonWebAppManager.zip"&gt;Here are the solution files.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fjohnkatsiotis%2farchive%2f2009%2f11%2f14%2fmake-your-site-run-only-in-one-browser-window-single-instance.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fjohnkatsiotis%2farchive%2f2009%2f11%2f14%2fmake-your-site-run-only-in-one-browser-window-single-instance.aspx&amp;amp;fgcolor=000000&amp;amp;bgcolor=CCFF00&amp;amp;cfgcolor=333333" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7255370" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/Web+Development/default.aspx">Web Development</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Set default value for Properties</title><link>http://weblogs.asp.net/johnkatsiotis/archive/2008/09/18/set-default-value-for-properties.aspx</link><pubDate>Thu, 18 Sep 2008 09:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6631655</guid><dc:creator>djsolid</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/johnkatsiotis/rsscomments.aspx?PostID=6631655</wfw:commentRss><comments>http://weblogs.asp.net/johnkatsiotis/archive/2008/09/18/set-default-value-for-properties.aspx#comments</comments><description>&lt;p&gt;Many times I needed to set a default value for a property.&lt;/p&gt;  &lt;p&gt;For example at the property below&lt;/p&gt;  &lt;p&gt;public string Property1 {get; set;}&lt;/p&gt;  &lt;p&gt;I wanted a default value "Value1". The only way was to create a private field or to set it in code like Property1 = "Value1" somewhere.&lt;/p&gt;  &lt;p&gt;What if I wanted to do this for all my properties ?&lt;/p&gt;  &lt;p&gt;For this case i decided to create a custom attribute which does that thing. Takes a value and if the value of the current property is null sets it to the given value.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;To be more specific let's begin with the custom attribute class:&lt;/p&gt;  &lt;pre style="overflow: auto;"&gt; [global::System.AttributeUsage(AttributeTargets.Property, Inherited = &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;, AllowMultiple = &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;)]&lt;br&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;sealed&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; DefaultValueAttribute : Attribute&lt;br&gt;    {&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; defaultValue;&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;readonly&lt;/span&gt; Type valueType;&lt;br&gt;&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; DefaultValueAttribute(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; defaultValue, Type valueType)&lt;br&gt;        {&lt;br&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.valueType = valueType;&lt;br&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.defaultValue = Convert.ChangeType(defaultValue, valueType);&lt;br&gt;        }&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; Type ValueType { &lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt; { &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; valueType; } }&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; DefaultValue&lt;br&gt;        {&lt;br&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt; { &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; defaultValue; }&lt;br&gt;        }&lt;br&gt;    }&lt;/pre&gt;

&lt;p&gt;Then we have a helper class with an extension method : &lt;/p&gt;

&lt;pre style="overflow: auto;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; DefaultValueAttributeHelper&lt;br&gt;    {&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; SetDefaultValues(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; obj)&lt;br&gt;        {&lt;br&gt;            Type t = obj.GetType();&lt;br&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; (var item &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; t.GetProperties())&lt;br&gt;            {&lt;br&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; (var attr &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; item.GetCustomAttributes(&lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(DefaultValueAttribute), &lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;))&lt;br&gt;                {&lt;br&gt;                    DefaultValueAttribute val = ((DefaultValueAttribute)attr);&lt;br&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (item.GetValue(obj, &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;) == &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt; ||&lt;br&gt;                        ((item.GetValue(obj, &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;).ToString() == "&lt;span style="color: rgb(139, 0, 0);"&gt;0&lt;/span&gt;") &amp;amp;&amp;amp; &lt;br&gt;                                       (val.ValueType != &lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;))))&lt;br&gt;                        item.SetValue(obj, val.DefaultValue, &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;);&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;&lt;br&gt;        }&lt;br&gt;    }&lt;/pre&gt;

&lt;p&gt;And finally how this can be used&amp;nbsp; for example at an ASP.NET Page: &lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre style="overflow: auto;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; partial &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; UserDetails : System.Web.UI.Page&lt;br&gt;    {&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; UserDetails()&lt;br&gt;        {&lt;br&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.SetDefaultValues();&lt;br&gt;        }&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br&gt;        {&lt;br&gt;            Response.Write(StringProp + "&lt;span style="color: rgb(139, 0, 0);"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;" + IntProp + "&lt;span style="color: rgb(139, 0, 0);"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;" + (DoubleProp + 1));&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        [DefaultValueAttribute("&lt;span style="color: rgb(139, 0, 0);"&gt;6.11354&lt;/span&gt;", &lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;double&lt;/span&gt;))]&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;double&lt;/span&gt; DoubleProp { &lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;; &lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;; }&lt;br&gt;&lt;br&gt;        [DefaultValueAttribute("&lt;span style="color: rgb(139, 0, 0);"&gt;6&lt;/span&gt;", &lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;))]&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; IntProp { &lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;; &lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;; }&lt;br&gt;&lt;br&gt;        [DefaultValueAttribute("&lt;span style="color: rgb(139, 0, 0);"&gt;String1&lt;/span&gt;", &lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;))]&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; StringProp { &lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;; &lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;; }&lt;br&gt;&lt;br&gt;&lt;br&gt;    }&lt;/pre&gt;

&lt;p&gt;Well that's all ... This is really simple. Next step is to create an interface so the above attirbute can be used with custom objects.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;If anyone has any improvements please let me know! &lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fjohnkatsiotis%2farchive%2f2008%2f09%2f18%2fset-default-value-for-properties.aspx" mce_href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fjohnkatsiotis%2farchive%2f2008%2f09%2f18%2fset-default-value-for-properties.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fjohnkatsiotis%2farchive%2f2008%2f09%2f18%2fset-default-value-for-properties.aspx&amp;amp;fgcolor=000000&amp;amp;bgcolor=CCFF00&amp;amp;cfgcolor=333333" mce_src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fjohnkatsiotis%2farchive%2f2008%2f09%2f18%2fset-default-value-for-properties.aspx&amp;amp;fgcolor=000000&amp;amp;bgcolor=CCFF00&amp;amp;cfgcolor=333333" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6631655" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/Custom+Attribute/default.aspx">Custom Attribute</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/Property/default.aspx">Property</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/Reflection/default.aspx">Reflection</category><category domain="http://weblogs.asp.net/johnkatsiotis/archive/tags/Default+Value/default.aspx">Default Value</category></item></channel></rss>