메뉴 닫기

ContainerListView and TreeListView: Writing VS.NET design-surface compatible controls

참조https://www.codeproject.com/Articles/3273/ContainerListView-and-TreeListView-Writing-VS-NET

ExtendedListViews_exe
ExtendedListViews_lib
extendedlistviews_src
TreeListView - extendedlistviews.gif
ContainerListView - extendedlistviews2.gif

Introduction

In today’s world, I’ve found that it becomes increasingly more complicated to render data in a meaningful and compact way. I’ve also found that the variety of controls, particularly ones for sale, seem to be created in a hurry, either because of time constraints or simply because of the desire to make money as cheaply as possible.
It was because of a lack of quality in existing components that I decided to take the time and create two controls that I desperately needed. The first is a listview that provides containers for controls or an image for every column, rather than only allowing text. The second is a quality hybrid tree-list that also provides the same features of the above mentioned list.
This article will overview these two controls, ContainerListView and TreeListView. Both controls were written purely using .NET classes in C#. I tried to avoid external API calls as much as possible. These two controls both make use of library for .NET, created by Pierre Arnaud, OPaC Bright Ideas. Pierre’s library allows the use of WindowsXP visual styles, by providing a wrapper for uxtheme.dll functions. This excellent library is available for download here on CodeProject, and an extended version (adds DrawThemeEdge function, required for these controls) is available in the zip. Many thanks to Pierre for creating this library, its served me well many times.
This is my first attempt at writing custom controls. Some of the logic is not optimized and is a little bloated. Several functions suck up a lot of CPU cycles, mostly the OnMouseDown code which tries to match a mouse click position to a visible item. I’m open to suggestions and bug fixes, and would greatly appreciate them. I will continue to work on both controls, adding features and optimizations however and wherever possible.

Topic focus

This article does not focus much on the creation of these two controls, although it does touch on some points. The inspiration for this article, in truth, was the amount of time I spent, trying to learn how to successfully integrate a control with the Visual Studio.NET design environment. Which was too much time. Both controls are fully compatible with the design surface in VS.NET, utilizing UITypeEditors and properly serializing source code.
The steps to accomplish such a task are very simple, but poorly documented and not well known. Most control developers skip the process of integrating their control with the design surface. My goal with this article is to familiarize you with .NET’s design features, and the few simple steps to add proper code serialization to your control.

The ContainerListView control

The standard .NET ListView control supports multiple columns, which can each hold a unique text value. In many instances, that simplicity is enough, or all that’s needed. All too often, though, the need arises to embed something other than text in a ListView‘s column.
The ContainerListView provides the ability to embed text, an image, or a control into each subitem of a ListView item. The control also adds a few fancy features, like column and row tracking, 3 unique context menus (column header, row, general), WindowsXP visual styles integration, and the ability to edit the items in design mode (including subitems and their image or control). The control also wires MouseDown events fired from a subitems control to the ContainerListView itself, ensuring proper row selection even when clicking on a sub-control.
Creation and population of a ContainerListView control is relatively simple. As mentioned, its entirely possible to drag and drop controls onto the design-surface in VS.NET, and have complete control over almost all design settings. If you prefer to manually code your GUI, here is an example:

ContainerListView clv = new ContainerListView();
clv.Text = "Sample ContainerListView";
clv.Name = "clv";
clv.Dock = DockStyle.Fill;
clv.VisualStyles = true;   // enable integration with
                           // WindowsXP visual styles
ContainerListViewItem clvi = new ContainerListViewItem();
clvi.Text = "Test";
// Add column headers
ToggleColumnHeader tch = new ToggleColumnHeader();
tch.Text = "Column 1";
clvi.Columns.Add(tch);
tch = new ToggleColumnHeader();
tch.Text = "Column 2";
clvi.Columns.Add(tch);
tch = new ToggleColumnHeader();
tch.Text = "Column 3";
clvi.Columns.Add(tch);
// Add a row item with a child progressbar
ContainerSubListViewItem cslvi = new ContainerSubListViewItem("Test");
clvi.SubItems.Add(cslvi);
ProgressBar pb = new ProgressBar();
pb.Value = 25;
cslvi = new ContainerSubListViewItem(pb);
clvi.SubItems.Add(cslvi);
clv.Items.Add(clvi);

This ContainerListView control inherits from the System.Windows.Forms.Control class, rather than extending the previously existing ListView control. Part of the goal was to see if I could create a control from scratch, and part was to keep it as low-profile as possible, without hooking into the Windows Common Controls (as the standard ListView does) or using Windows API calls. I wanted a purely .NET implementation. If you wish to examine the specifics of the control, take a look at the source code in the zip.

The TreeListView control

The TreeListView is a hybrid control. It blends a TreeView with the ContainerListView control above, allowing the first column to behave as a tree. TreeListView controls have become popular recently, and there are many available here on CodeProject and other sites. None had quite the features I was looking for, so I extended ContainerListView and added the tree. This TreeListView supports all the features of the ContainerListView except row tracking, which is currently in progress.
Here is an example:

TreeListView tlv = new TreeListView();
tlv.SmallImageList = smallImageList;
tlv.VisualStyles = true;
// Add column headers
ToggleColumnHeader tch = new ToggleColumnHeader();
tch.Text = "Tree Column";
tlv.Columns.Add(tch);
tch = new ToggleColumnHeader();
tch.Text = "Column 2";
tlv.Columns.Add(tch);
tch = new ToggleColumnHeader();
tch.Text = "Column 3";
tlv.Columns.Add(tch);
// Add tree nodes
TreeListNode tln = new TreeListNode();
tln.Text = "Test";
tln.ImageIndex = 1;
tln.SubItems.Add("Sub Item 1");
tln.SubItems.Add("Sub Item 2");
TreeListNode tln2 = new TreeListNode();
tln2.Text = "Child 1";
tln2.ImageIndex = -1; // Setting to -1 will suppress icon
tln2.SubItems.Add("Sub Item 1.1");
tln2.SubItems.Add("Sub Item 2.1");
tln2.Nodes.Add(tln2);
tlv.Nodes.Add(tln);
tln = new TreeListNode();
tln.Text = "Second Test";
tln.ImageIndex = 1;
tln.SubItems.Add("Test Item");
tln.SubItems.Add("Test Item");
tlv.Nodes.Add(tln);

Custom control rendering

The initial versions of these two controls used several private member functions to draw elements such as buttons, focus boxes, etc. A very large amount of code was required to render each state of the column header buttons, borders, etc.
The .NET framework provides a very handy class, the ControlPaint class in the System.Windows.Formsnamespace. This handy little class is loaded with static functions that provide rendering facilities for all sorts of objects, including buttons, borders, focus boxes, and plenty more. The use of the ControlPaint class can greatly reduce the amount of drawing code in your control, and help keep the proper Windows look and feel.
An important feature of these two controls is their Windows XP Visual Styles integration. This was accomplished using a library written by Pierre Arnaud. It wraps the visual styles rendering functions found in uxtheme.dll, and provides a very simple way to utilize them in .NET applications. This excellent library is available here on CodeProject: http://www.codeproject.com/cs/miscctrl/themedtabpage.asp. I highly recommend this library to anyone who wishes to easily integrate their controls with Windows XP. Pierre’s article also covers how to get tab pages to properly render under XP. Many thanks, Pierre, for a great library.

Integrating with the design surface

Now on to the meat of the article, integrating a control with the VS.NET design surface. Both these controls took approximately 4 days total, to write. Of those 4 days, over 3 were spent researching how to use .NET’s design facilities to make these controls as professional as possible, and as useful as possible.
Integrating a control, particularly a control that uses collections, requires the use of several design services available in .NET: UITypeEditors, TypeConverters, and design-time attributes. UITypeEditors provide a means of displaying a GUI editing dialog for any kind of object. TypeConverters provide a means of converting your custom classes into the proper source code. Design-time attributes provide the means to enable these design-time editing facilities in your control.

Selecting a UITypeEditor

Depending on your project, implementing a UITypeEditor can be very simple, or very complex. Using one of the supplied editors in the framework can make life very simple, and in very many cases, one of the supplied editors gets the job done very well. Other times, you may be required to write your own UITypeEditor, and that is beyond the scope of this article.
Some of the supplied UITypeEditors in the .NET framework follow. The System.Drawing.Design.FontEditor displays the standard font selection dialog when applied to a property. The default Control.Font property uses this editor. The System.Drawing.Design.ImageEditor displays an open file dialog filtered to image types, and is used in many places throughout the .NET framework. The System.Windows.Forms.Design.FileNameEditor displays the standard file open dialog for properties that require a filename. The System.Windows.Forms.Design.AnchorEditor displays the unique dropdown used for setting the Control.Anchor setting of every Windows Forms control.
The most unique and probably the most useful editor is the System.ComponentModel.Design.CollectionEditor. This displays a two-paned dialog box for editing collections of nearly any kind. The CollectionEditor expects only an indexer and add function in your collection to work properly with it. Implementing a CollectionEditor properly, ensuring proper code serialization, while not complex, is not documented well, and tedious to figure out by trial-and-error.

Integrating CollectionEditor into a control

To integrate a CollectionEditor for your control, you will need to do several, if not all, of the following tasks. Depending on how you implement the item class that will be contained in your collection class, there may be fewer things to implement than will be described here.
The first step in integrating CollectionEditor is developing your collection class and item class to be contained in that collection. A simple example follows:

public class MyCollectionItem
{
    // required for type converter
    public MyCollectionItem() { }
    #region Properties
    // properties here
    #endregion

    #region Methods
    // public methods here
    #endregion
}
public class MyCollection: CollectionBase
{
    // a basic indexer of the type of your collection 
    // item is required
    public MyCollectionItem this[int index]
    {
        get { return List[index]  as MyCollectionItem; }
        set { List[index] = value; }
    }
    // an Add method with a parameter of the type of
    // your collection item is required
    public int Add(MyCollectionItem item)
    {
        return List.Add(item);
    }
}

For the CollectionEditor to work, you must supply an indexer that takes an integer parameter, and returns the type of your collection item (in this case, MyCollectionItem), and an Add method that takes one parameter of the same type.
The next step requires that you add a property with a couple of attributes to your control class.

public class MyControl: Control
{
      protected MyCollection theCollection;
      [
        Category("Data"),
        Description("The collection of items for this control."),
        DesignerSerializationVisibility
        (DesignerSerializationVisibility.Content),
        Editor(typeof(CollectionEditor), typeof(UITypeEditor))
      ]
      public MyCollection TheCollection
      {
          get { return theCollection; }  // only getter, no setter
       }
}

The first two attributes are optional, specifying only where in the properties editor the property should go, and what it does. The next two are of more importance. The DesignerSerializationVisibility attribute instructs the design editor to serialize the contents of the collection to source code. This will place all the code required to add the items to a collection variable of your collection item type (in this case, MyCollectionItem).
The last attribute, Editor(), specifies what kind of editor the design editor should display. The attribute takes two arguments, System.Type, which specify the type of editor, and its parent type. In the example, we specified CollectionEditor, and UITypeEditor, from which all type editors should extend.
Integrating a CollectionEditor can become a little more complex at this point, although by no means hard. With the above examples, you will notice that no code is added to your source. This is because our collection item class, MyCollectionItem, inherits from nothing. The CollectionEditor only knows internally, how to serialize classes that extend Component. Often, simply extending Component will make CollectionEditorproperly serialize your code.
Sometimes, though, you may be required to implement a TypeConverter for your class. While it may seem intimidating to some, implementing a TypeConverter is, for the most part, a no brainer. This simple class will implement a TypeConverter for our MyCollectionItem class:

public class MyCollectionItemConverter: TypeConverter
{
    public override bool CanConvertTo
        (ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
     }
     public override object ConvertTo(ITypeDescriptorContext context,
             CultureInfo culture, object value, Type destinationType)
     {
         if (destinationType == typeof(InstanceDescriptor)
                     && value is MyCollectionItem)
         {
              MyCollectionItem item = (MyCollectionItem)value;
               ConstructorInfo ci = typeof(MyCollectionItem).
                                   GetConstructor(new Type[] {});
               if (ci != null)
               {
                     return new InstanceDescriptor(ci, null, false);
               }
          }
          return base.ConvertTo(context, culture, value, destinationType);
     }
}

All type converters must extend the TypeConverter class, and all must override CanConvertTo and ConvertTo methods. You should also call the base methods to make sure the converter can convert to types other than your collection item.
The second function does most of the work. It returns an InstanceDescriptor, which is a class in .NET that provides all the information required to create an instance of an object. In our type converter, we supply information about the constructor of our item class, and specify that the constructor does not describe the whole object. Specifying that this InstanceDescriptor only describes the constructor, will ensure that code to set the properties for your item class will be serialized to source.
Why do we need supply a TypeConverter? The CollectionEditor will attempt to serialize as much information about your class as it can in the form of properties. If your collection is part of a control, the CollectionEditor will need to know what the contstructor for your collection item is. Once it has this information, the CollectionEditor can add the MyControl.TheCollection.Add() lines to your source, adding each item to the collection contained in the control. Without knowledge of the constructor, the CollectionEditor can only create an instance of the collection item and add code to set its properties.
The final step in adding a CollectionEditor is adding two attributes to your collection item class. The first of these attributes will prevent instances of your class from cluttering the design surface. The second will associate your new TypeConverter with your item class.

[DesignTimeVisible(false), TypeConverter("MyCollectionItemConverter")]
public class MyCollectionItem
{
    // required for type converter
    public MyCollectionItem() { }
    #region Properties
    // properties here
    #endregion

    #region Methods
    // public methods here
    #endregion
}

Once you have your TypeConverter applied to your collection item class, you should be ready to go. A simple test with the design editor will let you know if the code is being serialized properly. In most cases, this should be enough. In extreme cases, you will need to implement ISerializable, and write your own serialization code for your class. That is beyond the scope of this article.

Final words

While there will be occasions that the information provided above will not help you successfully integrate a CollectionEditor into your control, my hope is that it will help most. Visual Studio .NET is a very rich development environment, and provides very powerful ways to implement design-surface compatible controls of your own. Many hard-core coders, including myself, prefer to code their UI manually. On the other hand, having a design editor available can save you in a pinch, and its important to have controls that work properly with it. I hope this article is useful to you, and I hope it will encourage the development of more design-aware controls.
The two controls introduced at the beginning of this article both implement CollectionEditors. This allows you to edit items and nodes in the design editor, if needed. CollectionEditors are even used nested, so when editing an item, you can open another editor to edit subitems. When adding controls to a ListView subitem, you must first add the control to the design surface. You will then be able to select it from a list in the subitems control property. Once the control is added to the list, you can still edit its properties simply by clicking on it. An unexpected side effect, but it was very welcome. I recommend caution when adding controls to ListViewsubitems. Not all controls will render properly, and some may have inadvertent issues when added. Controls tested so far have been ProgressBar, TextBox, PictureBox, and ComboBox.
Finally, I would like to ask two things of you if you have read this article and used the controls. First, please rate this article using the bar just above the comments. I’d like to get this moved from the “Unedited” section to a more appropriate section now that its more stable, and apparently that doesn’t happen unless people rate it.
Second, if you use these controls in a commercial application, some monetary support would be extremely helpful. I don’t have any plans to sell these controls right now, but the tech industry is a hard one to land a job in, and money doesn’t come easy for me. I don’t require that you pay for the controls, but if you can, you will really help me out. You can reach me through E-mail at jrista@hotmail.com if you would like to help.
Thanks for reading, and I hope the controls are useful to you. 🙂

268 Comments

  1. www.nyedupia.net

    I blog quite often and I truly thank you for your information.
    Your article has truly peaked my interest. I will bookmark
    your website and keep checking for new details about once per week.
    I subscribed to your RSS feed as well.

  2. Sammie Kjar

    I simply want to tell you that I am all new to blogs and absolutely enjoyed you’re website. Very likely I’m want to bookmark your website . You amazingly have excellent writings. With thanks for sharing your web site.

  3. can you buy viagra in italy

    I?m amazed, I need to state. Actually hardly ever do I run into a blog that?s both educative and also amusing, and also let me tell you, you have hit the nail on the head. Your concept is superior; the issue is something that inadequate people are talking intelligently about. I am really happy that I came across this in my search for something relating to this.

  4. windows with security screens

    Hey! This is kind of off topic but I need some help from an established blog. Is it very difficult to set up your own blog? I’m not very techincal but I can figure things out pretty fast. I’m thinking about making my own but I’m not sure where to begin. Do you have any ideas or suggestions? Cheers

  5. cbd liquid sale

    I?m pleased, I have to claim. Actually hardly ever do I come across a blog site that?s both educative and also entertaining, and also let me tell you, you have actually hit the nail on the head. Your suggestion is impressive; the problem is something that not nearly enough people are speaking smartly around. I am extremely pleased that I came across this in my look for something relating to this.

  6. see it here

    After research a few of the blog posts on your web site now, and also I genuinely like your way of blog writing. I bookmarked it to my book marking internet site listing and will certainly be checking back quickly. Pls check out my internet site also as well as let me know what you think.

  7. Google

    An outstanding share! I’ve just forwarded this onto a colleague who was doing a little research on this. And he actually bought me dinner simply because I stumbled upon it for him… lol. So let me reword this…. Thanks for the meal!! But yeah, thanks for spending the time to talk about this subject here on your site.

  8. Google

    You are so awesome! I do not think I have read through something like this before. So nice to discover somebody with original thoughts on this subject. Really.. many thanks for starting this up. This web site is one thing that is required on the internet, someone with a little originality!

  9. cairqq

    Hi there, I do believe your blog might be having internet browser compatibility problems. Whenever I take a look at your web site in Safari, it looks fine but when opening in I.E., it has some overlapping issues. I just wanted to give you a quick heads up! Aside from that, great website!

  10. dewacasino338

    I was excited to find this site. I wanted to thank you for your time due to this fantastic read!! I definitely loved every little bit of it and I have you book-marked to see new things in your web site.

  11. patenqq

    Aw, this was a very nice post. Taking a few minutes and actual effort to generate a great article… but what can I say… I procrastinate a lot and don’t manage to get nearly anything done.

  12. judi bola banyak bonus

    Oh my goodness! Incredible article dude! Thank you, However I am going through troubles with your RSS. I don’t understand the reason why I am unable to subscribe to it. Is there anyone else getting identical RSS problems? Anyone that knows the answer will you kindly respond? Thanks!!

  13. musafirdigital

    Oh my goodness! Awesome article dude! Thank you so much, However I am experiencing problems with your RSS. I don’t understand the reason why I am unable to subscribe to it. Is there anybody having similar RSS problems? Anyone who knows the solution can you kindly respond? Thanx!!

  14. vipmandiriqq

    An impressive share! I’ve just forwarded this onto a co-worker who has been doing a little homework on this. And he actually bought me dinner because I found it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanks for spending some time to discuss this issue here on your web page.

  15. poker pulsa

    Next time I read a blog, I hope that it does not disappoint me just as much as this particular one. After all, Yes, it was my choice to read, but I actually thought you would probably have something useful to say. All I hear is a bunch of crying about something that you could fix if you were not too busy looking for attention.

  16. joker123 pulsa

    You’re so awesome! I do not believe I have read through something like that before. So wonderful to find someone with unique thoughts on this subject. Seriously.. thanks for starting this up. This site is something that is needed on the web, someone with some originality!

  17. bet88 online

    This is the perfect webpage for anybody who wants to understand this topic. You realize a whole lot its almost tough to argue with you (not that I personally will need to…HaHa). You definitely put a new spin on a topic that’s been discussed for years. Wonderful stuff, just excellent!

  18. totobet sgp

    A motivating discussion is definitely worth comment. I believe that you need to write more on this subject, it might not be a taboo matter but typically people do not talk about these issues. To the next! Kind regards!!

  19. Firmanrahman

    An impressive share! I’ve just forwarded this onto a co-worker who was doing a little research on this. And he actually ordered me lunch because I found it for him… lol. So allow me to reword this…. Thank YOU for the meal!! But yeah, thanks for spending the time to talk about this issue here on your web site.

  20. totobet hk

    Oh my goodness! Amazing article dude! Thanks, However I am having troubles with your RSS. I don’t understand the reason why I am unable to join it. Is there anyone else having the same RSS issues? Anyone that knows the answer will you kindly respond? Thanx!!

  21. pabrik bubble wrap

    Oh my goodness! Awesome article dude! Thank you so much, However I am going through troubles with your RSS. I don’t know the reason why I can’t join it. Is there anybody getting identical RSS problems? Anybody who knows the answer can you kindly respond? Thanx!!

  22. Konsultan SMK3

    I’m impressed, I must say. Rarely do I encounter a blog that’s equally educative and interesting, and without a doubt, you’ve hit the nail on the head. The problem is an issue that too few people are speaking intelligently about. Now i’m very happy that I found this during my hunt for something regarding this.

  23. Ethelyn Sjolander

    There are absolutely a great deal of details like that to take into consideration. That is a great indicate bring up. I use the ideas above as basic motivation but clearly there are concerns like the one you raise where the most vital thing will certainly be working in truthful good faith. I don?t know if finest techniques have actually arised around points like that, yet I make sure that your work is plainly recognized as an up for grabs. Both kids as well as ladies feel the impact of simply a moment?s pleasure, for the rest of their lives.

  24. Reza Lukmana Channel

    I’m impressed, I must say. Seldom do I encounter a blog that’s both equally educative and engaging, and let me tell you, you have hit the nail on the head. The issue is something too few folks are speaking intelligently about. I’m very happy I came across this in my search for something regarding this.

  25. free ebooks to download and read

    Right here is the perfect webpage for anybody who would like to understand this topic. You understand a whole lot its almost tough to argue with you (not that I personally would want to…HaHa). You definitely put a brand new spin on a subject which has been written about for years. Excellent stuff, just wonderful!

  26. kaldu sapi bubuk

    After looking over a handful of the articles on your website, I seriously like your technique of blogging. I saved it to my bookmark website list and will be checking back soon. Please check out my website as well and let me know how you feel.

  27. soi cau so de 188loto

    Hi! I could have sworn I’ve been to this web site before but after looking at some of the articles I realized it’s new to me. Anyways, I’m definitely delighted I found it and I’ll be bookmarking it and checking back frequently!

  28. download joker123 apk

    I absolutely love your website.. Pleasant colors & theme. Did you create this web site yourself? Please reply back as I’m attempting to create my very own website and want to learn where you got this from or just what the theme is called. Thank you!

  29. joker slot apk

    Oh my goodness! Amazing article dude! Thank you so much, However I am going through difficulties with your RSS. I don’t understand the reason why I cannot subscribe to it. Is there anyone else getting the same RSS problems? Anybody who knows the solution will you kindly respond? Thanx!!

  30. poker 88

    I was pretty pleased to find this page. I need to to thank you for ones time due to this wonderful read!! I definitely really liked every bit of it and I have you saved as a favorite to look at new things in your web site.

  31. daftar joker123

    Hi, I do believe this is an excellent website. I stumbledupon it 😉 I am going to come back once again since I saved as a favorite it. Money and freedom is the best way to change, may you be rich and continue to help others.

  32. slot joker apk

    Can I simply say what a comfort to uncover someone who actually understands what they’re discussing on the web. You certainly realize how to bring a problem to light and make it important. More people really need to look at this and understand this side of your story. I was surprised that you are not more popular because you certainly possess the gift.

  33. QQ Online

    I blog frequently and I truly appreciate your content. This article has truly peaked my interest. I am going to book mark your website and keep checking for new details about once per week. I opted in for your RSS feed as well.

  34. Situs Judi Poker Online

    Hi! I could have sworn I’ve been to this site before but after browsing through many of the posts I realized it’s new to me. Anyways, I’m definitely delighted I discovered it and I’ll be bookmarking it and checking back regularly!

  35. Mobil Bekas Jakarta

    May I simply just say what a relief to uncover a person that really knows what they’re talking about online. You certainly realize how to bring an issue to light and make it important. More people really need to check this out and understand this side of your story. I can’t believe you’re not more popular since you most certainly have the gift.

  36. agen bola

    I blog often and I seriously appreciate your information. The article has truly peaked my interest. I’m going to bookmark your site and keep checking for new information about once per week. I opted in for your Feed as well.

  37. jagadpoker

    Hi there! This article couldn’t be written any better! Going through this article reminds me of my previous roommate! He always kept preaching about this. I am going to send this information to him. Pretty sure he’ll have a good read. Many thanks for sharing!

  38. dingdong online

    Hi, I do think this is an excellent website. I stumbledupon it 😉 I am going to come back yet again since i have book marked it. Money and freedom is the best way to change, may you be rich and continue to guide others.

  39. situs judi bola

    Hello! I could have sworn I’ve visited this website before but after browsing through many of the posts I realized it’s new to me. Nonetheless, I’m definitely pleased I came across it and I’ll be bookmarking it and checking back frequently!

  40. Harga Promo

    Next time I read a blog, Hopefully it won’t fail me as much as this particular one. After all, Yes, it was my choice to read, but I genuinely thought you would have something interesting to say. All I hear is a bunch of whining about something you could fix if you were not too busy searching for attention.

  41. click to find out more

    Can I just say what a relief to locate somebody that really understands what theyre discussing on the internet. You most definitely understand just how to bring a concern to light and make it essential. Even more individuals require to read this and understand this side of the tale. I cant believe youre not a lot more popular due to the fact that you definitely have the present.

  42. kelasjudi

    Can I just say what a comfort to uncover a person that truly understands what they’re discussing on the web. You actually realize how to bring an issue to light and make it important. More people need to look at this and understand this side of your story. I was surprised that you are not more popular given that you definitely possess the gift.

  43. s128

    Your style is very unique compared to other folks I have read stuff from. Many thanks for posting when you’ve got the opportunity, Guess I’ll just bookmark this blog.

  44. Judi Domino99

    Hi there! This post couldn’t be written any better! Looking at this post reminds me of my previous roommate! He continually kept preaching about this. I’ll send this article to him. Pretty sure he’s going to have a good read. Thank you for sharing!

  45. Sbobet777 Indonesia

    I’d like to thank you for the efforts you’ve put in writing this site. I’m hoping to check out the same high-grade blog posts by you later on as well. In truth, your creative writing abilities has motivated me to get my own website now 😉

  46. sabung ayam s128

    Hello there! I could have sworn I’ve visited this blog before but after browsing through some of the articles I realized it’s new to me. Regardless, I’m definitely delighted I came across it and I’ll be book-marking it and checking back frequently!

  47. s1288

    Aw, this was an exceptionally good post. Taking a few minutes and actual effort to make a really good article… but what can I say… I put things off a whole lot and never seem to get nearly anything done.

  48. s128 net

    Hi, I do think this is a great website. I stumbledupon it 😉 I’m going to revisit yet again since i have saved as a favorite it. Money and freedom is the greatest way to change, may you be rich and continue to guide others.

  49. s128

    After I initially commented I appear to have clicked on the -Notify me when new comments are added- checkbox and from now on every time a comment is added I receive 4 emails with the same comment. Is there an easy method you are able to remove me from that service? Thank you!

  50. jagos128

    Hi, I do believe this is a great blog. I stumbledupon it 😉 I’m going to come back yet again since I book-marked it. Money and freedom is the greatest way to change, may you be rich and continue to guide others.

  51. Judi Bet88

    I would like to thank you for the efforts you have put in writing this website. I really hope to see the same high-grade content from you later on as well. In truth, your creative writing abilities has encouraged me to get my own site now 😉

  52. read

    Great blog post. I find out something much more tough on different blogs daily. It will certainly constantly be promoting to check out content from various other authors and practice a little something from their shop. I?d favor to utilize some with the web content on my blog whether you don?t mind. Natually I?ll give you a web link on your internet blog site. Many thanks for sharing.

  53. sv388

    Good post. I learn something new and challenging on websites I stumbleupon everyday. It will always be exciting to read content from other writers and practice a little something from their websites.

  54. Judi Bandarqq

    When I initially commented I appear to have clicked on the -Notify me when new comments are added- checkbox and from now on each time a comment is added I recieve 4 emails with the same comment. There has to be a means you are able to remove me from that service? Kudos!

  55. Situs Judi Slot

    I seriously love your site.. Great colors & theme. Did you develop this website yourself? Please reply back as I’m attempting to create my very own blog and would love to learn where you got this from or exactly what the theme is called. Thank you!

  56. Agen Aduq Online

    An outstanding share! I’ve just forwarded this onto a co-worker who has been doing a little homework on this. And he in fact ordered me dinner due to the fact that I found it for him… lol. So let me reword this…. Thanks for the meal!! But yeah, thanx for spending some time to discuss this topic here on your web site.

  57. judi bola terpercaya

    Oh my goodness! Awesome article dude! Thank you so much, However I am going through difficulties with your RSS. I don’t know why I can’t join it. Is there anyone else getting identical RSS issues? Anybody who knows the answer will you kindly respond? Thanx!!

  58. http://180.215.15.98

    Hi there! I could have sworn I’ve visited this web site before but after browsing through many of the articles I realized it’s new to me. Regardless, I’m definitely happy I found it and I’ll be book-marking it and checking back often!

  59. senangdomino

    Oh my goodness! Incredible article dude! Thanks, However I am encountering problems with your RSS. I don’t know the reason why I can’t subscribe to it. Is there anybody getting similar RSS issues? Anyone who knows the solution can you kindly respond? Thanks!!

  60. s128

    Aw, this was a very nice post. Taking a few minutes and actual effort to produce a good article… but what can I say… I procrastinate a whole lot and never manage to get anything done.

  61. login s128

    After going over a number of the articles on your site, I truly appreciate your way of writing a blog. I added it to my bookmark webpage list and will be checking back soon. Please visit my web site too and tell me your opinion.

  62. s128 apk

    I was very pleased to discover this great site. I wanted to thank you for ones time for this wonderful read!! I definitely appreciated every little bit of it and i also have you bookmarked to look at new stuff in your blog.

  63. login totobet terbaru

    Right here is the perfect web site for anybody who would like to find out about this topic. You understand a whole lot its almost tough to argue with you (not that I really would want to…HaHa). You certainly put a new spin on a topic which has been discussed for many years. Great stuff, just great!

  64. ceriaqq

    An outstanding share! I’ve just forwarded this onto a friend who had been conducting a little homework on this. And he in fact ordered me dinner due to the fact that I stumbled upon it for him… lol. So allow me to reword this…. Thank YOU for the meal!! But yeah, thanks for spending time to talk about this matter here on your website.

  65. agen dominobet

    I would like to thank you for the efforts you’ve put in writing this website. I am hoping to view the same high-grade blog posts from you in the future as well. In fact, your creative writing abilities has encouraged me to get my own website now 😉

  66. poker online

    May I simply just say what a comfort to discover a person that actually knows what they are discussing on the net. You certainly understand how to bring an issue to light and make it important. More and more people need to read this and understand this side of the story. I was surprised that you are not more popular because you certainly possess the gift.

  67. 21naga

    Can I just say what a comfort to uncover somebody that actually knows what they are discussing on the internet. You certainly understand how to bring an issue to light and make it important. More people have to check this out and understand this side of your story. I was surprised you’re not more popular since you most certainly have the gift.

  68. solusiponsel

    After I originally commented I seem to have clicked the -Notify me when new comments are added- checkbox and from now on whenever a comment is added I get four emails with the exact same comment. Perhaps there is an easy method you can remove me from that service? Appreciate it!

  69. togel online terbaru

    Howdy! This blog post could not be written much better! Going through this article reminds me of my previous roommate! He always kept talking about this. I will send this post to him. Pretty sure he’ll have a good read. I appreciate you for sharing!

  70. totobet login

    Having read this I thought it was very enlightening. I appreciate you finding the time and effort to put this information together. I once again find myself spending a significant amount of time both reading and commenting. But so what, it was still worth it!

  71. s12888

    Good post. I learn something totally new and challenging on blogs I stumbleupon everyday. It’s always interesting to read through articles from other authors and practice a little something from their web sites.

  72. kamera4d

    Right here is the perfect site for everyone who hopes to understand this topic. You understand a whole lot its almost hard to argue with you (not that I really would want to…HaHa). You certainly put a fresh spin on a topic that has been discussed for ages. Wonderful stuff, just great!

  73. s1281.com

    Aw, this was a very good post. Finding the time and actual effort to generate a top notch article… but what can I say… I put things off a whole lot and don’t seem to get nearly anything done.

  74. indodewa99

    Good day! I could have sworn I’ve visited this web site before but after browsing through some of the articles I realized it’s new to me. Anyhow, I’m definitely delighted I discovered it and I’ll be bookmarking it and checking back frequently!

  75. susupoker

    I’m excited to find this web site. I wanted to thank you for ones time for this wonderful read!! I definitely enjoyed every bit of it and I have you saved to fav to check out new information on your site.

  76. JOINPOKER

    An outstanding share! I have just forwarded this onto a friend who had been conducting a little research on this. And he actually bought me dinner simply because I found it for him… lol. So allow me to reword this…. Thank YOU for the meal!! But yeah, thanx for spending the time to talk about this topic here on your web page.

  77. vivoslot

    A motivating discussion is worth comment. I do believe that you need to publish more on this topic, it might not be a taboo subject but generally people do not speak about these topics. To the next! Kind regards!!

  78. joker888

    Aw, this was an extremely nice post. Finding the time and actual effort to create a great article… but what can I say… I procrastinate a lot and don’t seem to get nearly anything done.

  79. joker123

    Hello, I believe your website might be having internet browser compatibility problems. Whenever I look at your site in Safari, it looks fine however, when opening in Internet Explorer, it’s got some overlapping issues. I just wanted to give you a quick heads up! Apart from that, wonderful site!

  80. s1288

    When I originally commented I appear to have clicked on the -Notify me when new comments are added- checkbox and from now on whenever a comment is added I recieve 4 emails with the exact same comment. Perhaps there is a means you are able to remove me from that service? Appreciate it!

  81. sbobet 88

    Aw, this was an extremely nice post. Finding the time and actual effort to create a superb article… but what can I say… I put things off a lot and don’t manage to get nearly anything done.

  82. judionline.com

    I would like to thank you for the efforts you’ve put in writing this blog. I really hope to view the same high-grade blog posts by you in the future as well. In fact, your creative writing abilities has motivated me to get my very own site now 😉

  83. s128

    Hi, I do believe this is a great blog. I stumbledupon it 😉 I will come back once again since I book marked it. Money and freedom is the best way to change, may you be rich and continue to help others.

  84. slotjoker

    I’m impressed, I must say. Rarely do I come across a blog that’s both educative and amusing, and without a doubt, you have hit the nail on the head. The issue is something too few folks are speaking intelligently about. I am very happy I found this during my hunt for something relating to this.

  85. joker123 online

    When I originally left a comment I seem to have clicked on the -Notify me when new comments are added- checkbox and from now on every time a comment is added I receive 4 emails with the same comment. Is there an easy method you are able to remove me from that service? Thanks a lot!

  86. joker123 net

    A fascinating discussion is worth comment. I believe that you need to write more about this subject matter, it might not be a taboo matter but typically people don’t talk about these subjects. To the next! Cheers!!

  87. joker123 slot online

    Hi there! I could have sworn I’ve visited this blog before but after looking at a few of the posts I realized it’s new to me. Nonetheless, I’m definitely delighted I came across it and I’ll be book-marking it and checking back often!

  88. joker123 slot

    Hello! I could have sworn I’ve been to this site before but after browsing through a few of the articles I realized it’s new to me. Nonetheless, I’m definitely pleased I stumbled upon it and I’ll be bookmarking it and checking back regularly!

  89. joker123

    After checking out a number of the articles on your web page, I honestly appreciate your way of writing a blog. I saved as a favorite it to my bookmark website list and will be checking back soon. Take a look at my web site as well and let me know your opinion.

  90. wongqq

    Nice post. I learn something new and challenging on sites I stumbleupon every day. It’s always useful to read articles from other authors and practice something from other sites.

  91. khazanahpromosi.com

    Having read this I thought it was really informative. I appreciate you finding the time and effort to put this short article together. I once again find myself spending a lot of time both reading and commenting. But so what, it was still worth it!

  92. Samsung Printer

    Hi there! This blog post couldn’t be written any better! Looking through this post reminds me of my previous roommate! He always kept talking about this. I’ll send this post to him. Fairly certain he will have a great read. Thank you for sharing!

  93. cek website ini

    Next time I read a blog, I hope that it does not fail me just as much as this particular one. I mean, Yes, it was my choice to read, but I truly believed you’d have something useful to talk about. All I hear is a bunch of crying about something that you could possibly fix if you weren’t too busy searching for attention.

  94. https://www.sallyponchak.com

    Hi there! This article couldn’t be written much better! Going through this article reminds me of my previous roommate! He continually kept talking about this. I most certainly will send this information to him. Fairly certain he will have a great read. Thanks for sharing!

  95. damandiri.com

    An outstanding share! I’ve just forwarded this onto a coworker who was conducting a little homework on this. And he in fact bought me breakfast simply because I discovered it for him… lol. So allow me to reword this…. Thank YOU for the meal!! But yeah, thanks for spending time to discuss this issue here on your web page.

  96. levidio dot musafirdigital dot com

    You’re so awesome! I don’t believe I’ve read through something like this before. So good to find someone with original thoughts on this subject matter. Really.. thank you for starting this up. This web site is something that is required on the web, someone with a bit of originality!

  97. agen joker388

    I blog frequently and I really appreciate your information. This article has truly peaked my interest. I’m going to take a note of your blog and keep checking for new details about once per week. I subscribed to your Feed as well.

  98. agen joker123 terpercaya

    Right here is the right webpage for everyone who would like to find out about this topic. You know a whole lot its almost hard to argue with you (not that I personally will need to…HaHa). You certainly put a new spin on a subject that’s been discussed for many years. Excellent stuff, just excellent!

  99. apk joker123

    You are so cool! I do not believe I’ve truly read a single thing like that before. So nice to discover another person with some unique thoughts on this subject matter. Seriously.. many thanks for starting this up. This web site is something that is required on the internet, someone with a bit of originality!

  100. link joker123

    Howdy, I do think your website may be having browser compatibility problems. Whenever I take a look at your blog in Safari, it looks fine however when opening in IE, it has some overlapping issues. I just wanted to provide you with a quick heads up! Other than that, fantastic site!

  101. login jokerwin123

    I’m impressed, I must say. Seldom do I encounter a blog that’s equally educative and entertaining, and let me tell you, you’ve hit the nail on the head. The problem is an issue that not enough men and women are speaking intelligently about. I’m very happy that I came across this during my search for something relating to this.

  102. Google

    I have to thank you for the efforts you’ve put in penning this website. I’m hoping to view the same high-grade content from you later on as well. In truth, your creative writing abilities has motivated me to get my very own site now 😉

  103. https://www.masterhoki.com

    I’m amazed, I have to admit. Rarely do I come across a blog that’s both educative and amusing, and without a doubt, you have hit the nail on the head. The problem is something which too few men and women are speaking intelligently about. I’m very happy that I came across this during my search for something regarding this.

  104. http://107.152.32.187/

    Right here is the perfect website for everyone who wants to understand this topic. You understand so much its almost tough to argue with you (not that I actually would want to…HaHa). You definitely put a brand new spin on a topic that has been written about for decades. Great stuff, just excellent!

  105. browse around this website

    There are absolutely a great deal of information like that to take into account. That is a fantastic indicate raise. I supply the thoughts above as basic inspiration however clearly there are questions like the one you raise where the most important point will be operating in truthful good faith. I don?t recognize if finest techniques have actually arised around points like that, but I make sure that your work is plainly identified as an up for grabs. Both children and also ladies really feel the impact of just a moment?s pleasure, for the remainder of their lives.

  106. Sylvia

    you’re actually a excellent webmaster. The website loading velocity is incredible. It kind of feels that you are doing any unique trick. Furthermore, The contents are masterwork. you’ve performed a wonderful task on this subject!

댓글 남기기

이메일은 공개되지 않습니다.