Sweet DevTools

Posted on : 25-10-2011 | By : manitra | In : C#

0

I just published few online tools for developers at devtools.manitra.net and I hope they will allow you to save time. The widgets currently available are :

Those tools already exist on the web but the key stuffs here is that they are :

  • tiny (minimalist web page without blabla about what a base64 encoding is etc ..)
  • embeddable as widget
  • free and ad-free

By the way, they are best used within a netvibes dashboard (Web Page Widget).

Enjoy :)

How to create deeply nested Asp.net Dynamic Controls ?

Posted on : 28-09-2010 | By : manitra | In : C#

13

Creating controls at runtime (dynamic controls) in Asp.net is both tricky and unintuitive. This article will explain a pattern to make it easier.

The main advantages of this strategy are :
- ability to create deeply nested controls with unlimited depth
- each dynamicaly created controls have normal states (Viewstate is not broken)
- you can create those controls whenever you want (including OnClick events, PreRender and Render phases)
- no hacks with postback arguments are required

[UPDATE (2011/08/01)] : “M” found that the PersistentPanel doesn’t work well when it is instantiated in a markup file (aspx/ascx/master …) so I would advice you to instanciate it via code in the CreateChildControl method. The source code in the bottom of the page have been updated to reflect that.

The online demo

To help you understand what am I talking about here is an online example of deeply nested and dynamically created controls using Asp.Net.

You can create as much nested controls as you want and test that each controls persists its state upon postbacks.

The implementation

The PersistentPanel

The PersistentPanel is just a Panel wich persists its child controls collection using the viewstate automatically. This is a key control because it recreates the dynamically created controls on each post back during the right life-cycle phase : OnLoadViewstate. Thanks to this early recreation, those controls can persist their state in the ViewState like any controls declared in the markup page during the design time.

This kind of component is quite common now a days but the particularity here is that I do not try to persits all the nested controls but only the direct children. Indeed, if you try to persist and recreate the whole hierarchy, you’ll encounter problems and will have to handle a lot of special cases. More over since event handlers are not persisted, the restored components wont work.

The implementation process of the PersitentPanel :

  • during the save process of the viewstate we save the control hierarchy (type+Id only) using a serializable entity that store the control type, its Id and and a list of children
  • during the restore process of the viewstate we refill the Controls collection using the previously saved control hierarchy
  1.     public class PersistentPanel : Panel
  2.     {
  3.         private static string ControlsViewStateKey = "Controls";
  4.         public int MaxDepth
  5.         {
  6.             get
  7.             {
  8.                 var value = ViewState["MaxDepth"];
  9.                 if (value != null) return (int)value;
  10.                 return 1;
  11.             }
  12.             set
  13.             {
  14.                 ViewState["MaxDepth"] = value;
  15.             }
  16.         }
  17.  
  18.         protected override void LoadViewState(object savedState)
  19.         {
  20.             base.LoadViewState(savedState);
  21.             var persisted = (ControlEntity)ViewState[ControlsViewStateKey];
  22.             if (persisted != null)
  23.                 foreach (var child in persisted.Children)
  24.                     Controls.Add(child.ToControl());
  25.         }
  26.  
  27.         protected override object SaveViewState()
  28.         {
  29.             ViewState[ControlsViewStateKey] = new ControlEntity(this, MaxDepth);
  30.             var result = base.SaveViewState();
  31.             return result;
  32.         }
  33.     }

The parent of the dynamic controls

The component wich will dynamicaly create the controls will first embed a PersistentPanel. And each time it will want to add a control it will add that control in the PersistentPanel’s controls collection. Here is an example :

  1. public class CustomerView : Page {
  2.     private PersistentPanel ctlPanel;
  3.     // —— //
  4.     protected void ctlAdd_click(object sender, EventArgs e){
  5.         ctlPanel.Controls.Add(new Textbox{Text=Datetime.Now.ToString();});
  6.     }
  7.  
  8. }

Combining both to build a hierarchical data editor

Now we have a persistant panel and know that dynamically created controls are persisted, we’ll create a control that would create other complexes controls wich will have the same type as their creator. This would give us a powerfull control that would be able to display or edit hierarchical data wich, in our case, is a filter expression. We’ll have
- a control to edit scalar filter
- a control to edit composite filter
The scalar filter will just contain 3 simple controls for the field name, the operator and the value. The composite filter editor will be the interesting one. Indeed, it’s gonna contains a variable number of scalar editor and other composite filter editor. So it will use a persistant panel to host those nested controls. And that’s it !

  1. public class compositeView : WebControl, INamingContainer

Conclusion

The important things to remember are that :
- a control can be created at anytime, but it must be recreated on each postback during/before the LoadViewState of its container
- the ID of the dynamic control must be the same
- event handlers are not persisted, you have to rewire them up on each postback, the PersistantPanel has the ControlRestored event wich is the best place to do so.

Download the source code

The online demo application is available here :

Have fun !

Concise C# Part 3 : C# 3 shortcuts

Posted on : 07-09-2009 | By : manitra | In : C#

0

The version 3 of C# brings us a lot of syntactic sugar to reduce the length of our code. Here are some of them.

This post is part of a serie about making C# code shorter.

Constructors with Property initializers

  1. //Verbose and Ugly
  2. Post value = new Post();
  3. value.Title = "New Version For C#";
  4. value.CreatedOn = DateTime.Now;
  5. CreatePost(value);
  6.  
  7. //Concise and Sweet
  8. CreatePost(new Post
  9. {
  10.     Title = "NewVersion For C#",
  11.     CreatedOn = DateTime.Now
  12. });

Collection initializers

  1. //Verbose and Ugly
  2. var names = new List<string>();
  3. names.Add("manitra");
  4. names.Add("yeah");
  5. SaveNames(names);
  6.  
  7. //Concise and Sweet
  8. SaveNames(new List<string> { "manitra", "yeah" });

Var keyword

  1. //Verbose and Ugly
  2. Dictionary<string, List<Post>> result = new Dictionary<string, List<Post>>();
  3.  
  4. //Concise and Sweet (But still strongly typed)
  5. var result = new Dictionary<string, List<Post>>();

Automatic properties

  1. //Verbose and Ugly
  2. public class Post
  3. {
  4.     private string title;
  5.     private string description;
  6.     private DateTime createdOn;
  7.  
  8.     public string Title
  9.     {
  10.         get
  11.         {
  12.             return this.title;
  13.         }
  14.         set
  15.         {
  16.             this.title = value;
  17.         }
  18.     }
  19.  
  20.     public string Description
  21.     {
  22.         get
  23.         {
  24.             return this.description;
  25.         }
  26.         set
  27.         {
  28.             this.description = value;
  29.         }
  30.     }
  31.  
  32.     public System.DateTime CreatedOn
  33.     {
  34.         get
  35.         {
  36.             return this.createdOn;
  37.         }
  38.         set
  39.         {
  40.             this.createdOn = value;
  41.         }
  42.     }
  43. }
  44.  
  45. //Concise and Sweet
  46. public class Post
  47. {
  48.     public string Title { get; set; }
  49.     public string Description { get; set; }
  50.     public DateTime CreatedOn { get; set; }
  51. }

Concise C# Part 2 : Try Catch and reusability

Posted on : 03-09-2009 | By : manitra | In : C#

0

Exception handling is an important part of any software. In this post, I will talk about a trick to make but some kind of reusability on exception handling.

This post is part of a serie about making C# code shorter

When you write code, you usually try to reuse your code by creating methods and calling those methods each time you the need their functionality. When working with exceptions, it’s a bit tricky because, they don’t follow the normal code flow, they jump out of your method … unless you catch them. The consequence is that you usually have multiple similar try {} catch {} blocks that are often copied and pasted.

This is what usually happens

  1. public void Method1()
  2. {
  3.     try
  4.     {
  5.         //method 1 content
  6.     }
  7.     catch (ThreadAbortException)
  8.     {
  9.     }
  10.     catch (IOException ex)
  11.     {
  12.         //IO exception handling
  13.     }
  14.     finally
  15.     {
  16.         //add any code for releasing ressource
  17.     }
  18. }
  19.  
  20. public void Method2()
  21. {
  22.     try
  23.     {
  24.         //method 2 content
  25.     }
  26.     catch (ThreadAbortException)
  27.     {
  28.     }
  29.     catch (IOException ex)
  30.     {
  31.         //IO exception handling
  32.     }
  33.     finally
  34.     {
  35.         //add any code for releasing ressource
  36.     }
  37. }

The solution to reuse the exception block

This is what you could do to reuse the same error handling code block in c# :

  1. public void Method1()
  2. {
  3.     Do(() =>
  4.     {
  5.         //method 1 content
  6.     });
  7. }
  8.  
  9. public void Method2()
  10. {
  11.     Do(() =>
  12.     {
  13.         //method 2 content
  14.     });
  15. }
  16.  
  17. protected void Do(Action method)
  18. {
  19.     try
  20.     {
  21.         //code to call before each methods
  22.         method();
  23.         //code to call after each methods success
  24.     }
  25.     catch (ThreadAbortException)
  26.     {
  27.     }
  28.     catch (IOException ex)
  29.     {
  30.         //IO exception handling
  31.     }
  32.     finally
  33.     {
  34.         //add any code for releasing ressource
  35.     }
  36. }

Concise C# Part 1 : Extension methods and Linq

Posted on : 27-08-2009 | By : manitra | In : C#

0

Because, short code is easier to understand, I decided to publish some posts about making C# code shorter. I’ll talk about small tricks I use to significantly reduce the amount of code I write to achieve my goals. Some people don’t agree with that idea because there has been abuses done by perl and c programmer in the past. I think that, if you use correct names for methods, variable and types, the shortest code will still be easy to understand.

This post is part of a serie about making C# code shorter

In this post, I’ll use the following class for my examples :

  1. public class Post
  2. {
  3.     public int Id { get; set; }
  4.     public string Author { get; set; }
  5.     public string Title { get; set; }
  6.     public string Content { get; set; }
  7. }

Linq extension methods

Linq is a set of contracts (interfaces) wich allow the developper to request objects from a data store. What make it unique is that :
- the query language is strongly typed (at compile time you are sure that all column names et types are corrects and that there are no missin semi-colon
- it supports unlimited data store type (including all database systems, xml files, google data, twitter posts, in memory objects …)

I’ll focus primarily on Linq to Objects (in memory object) because we’re talking about making code concise. So here are the shortcuts !

Searching an unique element in a collection

  1. //Concise and Sweet
  2. public Post GetById(int id, IList<Post> posts)
  3. {
  4.     return posts.FirstOrDefault(p => p.Id == id);
  5. }
  6.  
  7. //Verbose and Ugly
  8. public Post GetById(int id, IList<Post> posts)
  9. {
  10.     foreach (Post current in posts)
  11.     {
  12.         if (current.Id == id)
  13.         {
  14.             return current;
  15.         }
  16.     }
  17. }

Filtering a collection

  1. //Concise and Sweet
  2. public IList<Post> FindByAuthor(string author, IList<Post> posts)
  3. {
  4.     return posts.Where(p => p.Author == author).ToList();
  5. }
  6.  
  7. //Verbose and Ugly
  8. public IList<Post> FindByAuthor(string author, IList<Post> posts)
  9. {
  10.     List<Post> result = new List<Post>();
  11.     foreach (Post current in posts)
  12.     {
  13.         if (current.Author == author)
  14.         {
  15.             result.Add(current);
  16.         }
  17.     }
  18.     return result;
  19. }

Selecting a column (one property of an object collection)

  1. //Concise and Sweet
  2. public IList<string> ExtractTitles(IList<Post> posts)
  3. {
  4.     return posts.Select(p => p.Title).ToList();
  5. }
  6.  
  7. //Verbose and Ugly
  8. public IList<string> ExtractTitles(IList<Post> posts)
  9. {
  10.     List<string> result = new List<string>();
  11.     foreach (Post current in posts)
  12.     {
  13.         result.Add(current.Title);
  14.     }
  15.     return result;
  16. }

Apply changes to a collection

  1. //Concise and Sweet
  2. public IList<Post> Anonymize(IList<Post> posts)
  3. {
  4.     return posts.Select(p => new Post
  5.     {
  6.         Id = p.Id,
  7.         Title = p.Title,
  8.         Author = "***",
  9.         Content = p.Content
  10.     }).ToList();
  11. }
  12.  
  13. //Verbose and Ugly
  14. public IList<Post> Anonymize(IList<Post> posts)
  15. {
  16.     List<Post> result = new List<Post>();
  17.     foreach (Post current in posts)
  18.     {
  19.         Post anonymousPost = new Post();
  20.         anonymousPost.Id = current.Id;
  21.         anonymousPost.Title = current.Title;
  22.         anonymousPost.Author = "***";
  23.         anonymousPost.Content = current.Content;
  24.         result.Add(anonymousPost);
  25.     }
  26.     return result;
  27. }

Creating your own extension methods

Extension methods are the best candidates when you plan to build your very own low level toolset. Here are some examples to give you an idea.

  1. public static class MyExtensions
  2. {
  3.     //Index a collection by its key
  4.     public static IDictionary<TKey, TObject> IndexBy<TObject, TKey>(this IEnumerable<TObject> target, Func<TObject, TKey> keyExtractor)
  5.     {
  6.  
  7.         var result = new Dictionary<TKey, TObject>();
  8.         foreach (var current in target)
  9.             result[keyExtractor(current)] = current;
  10.         return result;
  11.     }
  12.  
  13.     //Joining any collection of string (array, list, enumerable …)
  14.     public static string Join(this IEnumerable<string> elements, string separator)
  15.     {
  16.         return string.Join(separator, elements.ToArray());
  17.     }
  18. }