diff --git a/public/_redirects b/public/_redirects index fb51490..e0a8279 100644 --- a/public/_redirects +++ b/public/_redirects @@ -129,4 +129,9 @@ # Catch-all for any remaining WordPress ?p= encoded URLs /blog/index.html%3F* /blog 301 +# Multi-segment .html strip (Cloudflare /*.html only matches single-segment) +/:a/:b.html /:a/:b 301 +/:a/:b/:c.html /:a/:b/:c 301 +/:a/:b/:c/:d.html /:a/:b/:c/:d 301 + # Doc/API legacy path redirects diff --git a/public/blog/wp-content/uploads/2011/01/is-full-300x229.jpg b/public/blog/wp-content/uploads/2011/01/is-full-300x229.jpg new file mode 100644 index 0000000..51c3c48 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/is-full-300x229.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/is-full.jpg b/public/blog/wp-content/uploads/2011/01/is-full.jpg new file mode 100644 index 0000000..6406813 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/is-full.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/is-highlight-300x229.jpg b/public/blog/wp-content/uploads/2011/01/is-highlight-300x229.jpg new file mode 100644 index 0000000..5dd7507 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/is-highlight-300x229.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/is-highlight.jpg b/public/blog/wp-content/uploads/2011/01/is-highlight.jpg new file mode 100644 index 0000000..19497e8 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/is-highlight.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/stdl-full-300x206.jpg b/public/blog/wp-content/uploads/2011/01/stdl-full-300x206.jpg new file mode 100644 index 0000000..0fe13ce Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/stdl-full-300x206.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/stdl-full.jpg b/public/blog/wp-content/uploads/2011/01/stdl-full.jpg new file mode 100644 index 0000000..4c64c36 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/stdl-full.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/stdl-highlight-300x206.jpg b/public/blog/wp-content/uploads/2011/01/stdl-highlight-300x206.jpg new file mode 100644 index 0000000..e907c81 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/stdl-highlight-300x206.jpg differ diff --git a/public/blog/wp-content/uploads/2011/01/stdl-highlight.jpg b/public/blog/wp-content/uploads/2011/01/stdl-highlight.jpg new file mode 100644 index 0000000..b900449 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/01/stdl-highlight.jpg differ diff --git a/public/blog/wp-content/uploads/2011/02/borders-150x150.jpg b/public/blog/wp-content/uploads/2011/02/borders-150x150.jpg new file mode 100644 index 0000000..4affc6b Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/borders-150x150.jpg differ diff --git a/public/blog/wp-content/uploads/2011/02/borders-300x300.jpg b/public/blog/wp-content/uploads/2011/02/borders-300x300.jpg new file mode 100644 index 0000000..970fbff Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/borders-300x300.jpg differ diff --git a/public/blog/wp-content/uploads/2011/02/borders.jpg b/public/blog/wp-content/uploads/2011/02/borders.jpg new file mode 100644 index 0000000..0ad6204 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/borders.jpg differ diff --git a/public/blog/wp-content/uploads/2011/02/extra-graphics-150x150.png b/public/blog/wp-content/uploads/2011/02/extra-graphics-150x150.png new file mode 100644 index 0000000..adb551f Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/extra-graphics-150x150.png differ diff --git a/public/blog/wp-content/uploads/2011/02/extra-graphics-300x300.png b/public/blog/wp-content/uploads/2011/02/extra-graphics-300x300.png new file mode 100644 index 0000000..94988ae Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/extra-graphics-300x300.png differ diff --git a/public/blog/wp-content/uploads/2011/02/extra-graphics.png b/public/blog/wp-content/uploads/2011/02/extra-graphics.png new file mode 100644 index 0000000..28586c0 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/extra-graphics.png differ diff --git a/public/blog/wp-content/uploads/2011/02/screenshot-300x196.jpg b/public/blog/wp-content/uploads/2011/02/screenshot-300x196.jpg new file mode 100644 index 0000000..ac8be6d Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/screenshot-300x196.jpg differ diff --git a/public/blog/wp-content/uploads/2011/02/screenshot.jpg b/public/blog/wp-content/uploads/2011/02/screenshot.jpg new file mode 100644 index 0000000..49965f3 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/02/screenshot.jpg differ diff --git a/public/blog/wp-content/uploads/2011/03/screen-styles-238x300.png b/public/blog/wp-content/uploads/2011/03/screen-styles-238x300.png new file mode 100644 index 0000000..de6529f Binary files /dev/null and b/public/blog/wp-content/uploads/2011/03/screen-styles-238x300.png differ diff --git a/public/blog/wp-content/uploads/2011/03/screen-styles.png b/public/blog/wp-content/uploads/2011/03/screen-styles.png new file mode 100644 index 0000000..4b9121c Binary files /dev/null and b/public/blog/wp-content/uploads/2011/03/screen-styles.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-1-300x176.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-1-300x176.png new file mode 100644 index 0000000..1856f7b Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-1-300x176.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-1.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-1.png new file mode 100644 index 0000000..66ee4e2 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-1.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-2-300x134.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-2-300x134.png new file mode 100644 index 0000000..ed3b5db Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-2-300x134.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-2.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-2.png new file mode 100644 index 0000000..4299360 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-2.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-3-300x103.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-3-300x103.png new file mode 100644 index 0000000..415022a Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-3-300x103.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-3.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-3.png new file mode 100644 index 0000000..4464ec3 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-3.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-4-300x61.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-4-300x61.png new file mode 100644 index 0000000..664752d Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-4-300x61.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-4.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-4.png new file mode 100644 index 0000000..5e9c1dd Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-4.png differ diff --git a/public/blog/wp-content/uploads/2011/05/cowl-blog-5.png b/public/blog/wp-content/uploads/2011/05/cowl-blog-5.png new file mode 100644 index 0000000..283fe5b Binary files /dev/null and b/public/blog/wp-content/uploads/2011/05/cowl-blog-5.png differ diff --git a/public/blog/wp-content/uploads/2011/06/blv-thumbnails-2-300x242.jpg b/public/blog/wp-content/uploads/2011/06/blv-thumbnails-2-300x242.jpg new file mode 100644 index 0000000..c5e9830 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/06/blv-thumbnails-2-300x242.jpg differ diff --git a/public/blog/wp-content/uploads/2011/06/blv-thumbnails-2.jpg b/public/blog/wp-content/uploads/2011/06/blv-thumbnails-2.jpg new file mode 100644 index 0000000..01d28ce Binary files /dev/null and b/public/blog/wp-content/uploads/2011/06/blv-thumbnails-2.jpg differ diff --git a/public/blog/wp-content/uploads/2011/06/blv-thumbnails-300x242.jpg b/public/blog/wp-content/uploads/2011/06/blv-thumbnails-300x242.jpg new file mode 100644 index 0000000..9735858 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/06/blv-thumbnails-300x242.jpg differ diff --git a/public/blog/wp-content/uploads/2011/06/blv-thumbnails.jpg b/public/blog/wp-content/uploads/2011/06/blv-thumbnails.jpg new file mode 100644 index 0000000..5a50dc7 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/06/blv-thumbnails.jpg differ diff --git a/public/blog/wp-content/uploads/2011/06/list-view-drag-drop-reordering-1.png b/public/blog/wp-content/uploads/2011/06/list-view-drag-drop-reordering-1.png new file mode 100644 index 0000000..82da67f Binary files /dev/null and b/public/blog/wp-content/uploads/2011/06/list-view-drag-drop-reordering-1.png differ diff --git a/public/blog/wp-content/uploads/2011/06/list-view-drag-drop-reordering-2.png b/public/blog/wp-content/uploads/2011/06/list-view-drag-drop-reordering-2.png new file mode 100644 index 0000000..358874b Binary files /dev/null and b/public/blog/wp-content/uploads/2011/06/list-view-drag-drop-reordering-2.png differ diff --git a/public/blog/wp-content/uploads/2011/07/betterlistview2-overview1-300x279.png b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview1-300x279.png new file mode 100644 index 0000000..2644ff4 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview1-300x279.png differ diff --git a/public/blog/wp-content/uploads/2011/07/betterlistview2-overview1.png b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview1.png new file mode 100644 index 0000000..b6445c5 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview1.png differ diff --git a/public/blog/wp-content/uploads/2011/07/betterlistview2-overview2-300x262.png b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview2-300x262.png new file mode 100644 index 0000000..9a00341 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview2-300x262.png differ diff --git a/public/blog/wp-content/uploads/2011/07/betterlistview2-overview2.png b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview2.png new file mode 100644 index 0000000..73f2398 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview2.png differ diff --git a/public/blog/wp-content/uploads/2011/07/betterlistview2-overview3-300x280.png b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview3-300x280.png new file mode 100644 index 0000000..ea7b6c0 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview3-300x280.png differ diff --git a/public/blog/wp-content/uploads/2011/07/betterlistview2-overview3.png b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview3.png new file mode 100644 index 0000000..5917c6b Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/betterlistview2-overview3.png differ diff --git a/public/blog/wp-content/uploads/2011/07/blv-aero-300x213.png b/public/blog/wp-content/uploads/2011/07/blv-aero-300x213.png new file mode 100644 index 0000000..45b4c56 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/blv-aero-300x213.png differ diff --git a/public/blog/wp-content/uploads/2011/07/blv-aero.png b/public/blog/wp-content/uploads/2011/07/blv-aero.png new file mode 100644 index 0000000..b97f0d4 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/blv-aero.png differ diff --git a/public/blog/wp-content/uploads/2011/07/blv-classic-300x213.png b/public/blog/wp-content/uploads/2011/07/blv-classic-300x213.png new file mode 100644 index 0000000..7b61652 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/blv-classic-300x213.png differ diff --git a/public/blog/wp-content/uploads/2011/07/blv-classic.png b/public/blog/wp-content/uploads/2011/07/blv-classic.png new file mode 100644 index 0000000..bd3958f Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/blv-classic.png differ diff --git a/public/blog/wp-content/uploads/2011/07/blv-luna-300x213.png b/public/blog/wp-content/uploads/2011/07/blv-luna-300x213.png new file mode 100644 index 0000000..e3821e0 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/blv-luna-300x213.png differ diff --git a/public/blog/wp-content/uploads/2011/07/blv-luna.png b/public/blog/wp-content/uploads/2011/07/blv-luna.png new file mode 100644 index 0000000..386914c Binary files /dev/null and b/public/blog/wp-content/uploads/2011/07/blv-luna.png differ diff --git a/public/blog/wp-content/uploads/2011/08/blv-fileexplorersample.png b/public/blog/wp-content/uploads/2011/08/blv-fileexplorersample.png new file mode 100644 index 0000000..9c4fe6e Binary files /dev/null and b/public/blog/wp-content/uploads/2011/08/blv-fileexplorersample.png differ diff --git a/public/blog/wp-content/uploads/2011/08/column-hide-after.png b/public/blog/wp-content/uploads/2011/08/column-hide-after.png new file mode 100644 index 0000000..ef0ac87 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/08/column-hide-after.png differ diff --git a/public/blog/wp-content/uploads/2011/08/column-hide-before-300x82.png b/public/blog/wp-content/uploads/2011/08/column-hide-before-300x82.png new file mode 100644 index 0000000..8f7a9bf Binary files /dev/null and b/public/blog/wp-content/uploads/2011/08/column-hide-before-300x82.png differ diff --git a/public/blog/wp-content/uploads/2011/08/column-hide-before.png b/public/blog/wp-content/uploads/2011/08/column-hide-before.png new file mode 100644 index 0000000..29fbcbf Binary files /dev/null and b/public/blog/wp-content/uploads/2011/08/column-hide-before.png differ diff --git a/public/blog/wp-content/uploads/2011/09/2611677_345f676344.jpg b/public/blog/wp-content/uploads/2011/09/2611677_345f676344.jpg new file mode 100644 index 0000000..bce207d Binary files /dev/null and b/public/blog/wp-content/uploads/2011/09/2611677_345f676344.jpg differ diff --git a/public/blog/wp-content/uploads/2011/09/vs-error-list-300x111.png b/public/blog/wp-content/uploads/2011/09/vs-error-list-300x111.png new file mode 100644 index 0000000..ed9a92e Binary files /dev/null and b/public/blog/wp-content/uploads/2011/09/vs-error-list-300x111.png differ diff --git a/public/blog/wp-content/uploads/2011/09/vs-error-list.png b/public/blog/wp-content/uploads/2011/09/vs-error-list.png new file mode 100644 index 0000000..57cdba3 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/09/vs-error-list.png differ diff --git a/public/blog/wp-content/uploads/2011/10/samples-cs-vb-300x80.png b/public/blog/wp-content/uploads/2011/10/samples-cs-vb-300x80.png new file mode 100644 index 0000000..b294e93 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/10/samples-cs-vb-300x80.png differ diff --git a/public/blog/wp-content/uploads/2011/10/samples-cs-vb.png b/public/blog/wp-content/uploads/2011/10/samples-cs-vb.png new file mode 100644 index 0000000..539354f Binary files /dev/null and b/public/blog/wp-content/uploads/2011/10/samples-cs-vb.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-keep-selection-highlight-300x178.png b/public/blog/wp-content/uploads/2011/11/screen-keep-selection-highlight-300x178.png new file mode 100644 index 0000000..86fcd80 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-keep-selection-highlight-300x178.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-keep-selection-highlight.png b/public/blog/wp-content/uploads/2011/11/screen-keep-selection-highlight.png new file mode 100644 index 0000000..16fd6f6 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-keep-selection-highlight.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-multi-line-2.png b/public/blog/wp-content/uploads/2011/11/screen-multi-line-2.png new file mode 100644 index 0000000..6295b03 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-multi-line-2.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-multiple-hot-items-300x176.png b/public/blog/wp-content/uploads/2011/11/screen-multiple-hot-items-300x176.png new file mode 100644 index 0000000..986ba70 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-multiple-hot-items-300x176.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-multiple-hot-items.png b/public/blog/wp-content/uploads/2011/11/screen-multiple-hot-items.png new file mode 100644 index 0000000..cded606 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-multiple-hot-items.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-wrapping-300x70.png b/public/blog/wp-content/uploads/2011/11/screen-wrapping-300x70.png new file mode 100644 index 0000000..1ed6c9f Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-wrapping-300x70.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screen-wrapping.png b/public/blog/wp-content/uploads/2011/11/screen-wrapping.png new file mode 100644 index 0000000..3da6f7e Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screen-wrapping.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screenshot-newlines-295x300.png b/public/blog/wp-content/uploads/2011/11/screenshot-newlines-295x300.png new file mode 100644 index 0000000..86359a2 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screenshot-newlines-295x300.png differ diff --git a/public/blog/wp-content/uploads/2011/11/screenshot-newlines.png b/public/blog/wp-content/uploads/2011/11/screenshot-newlines.png new file mode 100644 index 0000000..0b77d00 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/screenshot-newlines.png differ diff --git a/public/blog/wp-content/uploads/2011/11/text-formatting-vertical-align-300x264.png b/public/blog/wp-content/uploads/2011/11/text-formatting-vertical-align-300x264.png new file mode 100644 index 0000000..770f152 Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/text-formatting-vertical-align-300x264.png differ diff --git a/public/blog/wp-content/uploads/2011/11/text-formatting-vertical-align.png b/public/blog/wp-content/uploads/2011/11/text-formatting-vertical-align.png new file mode 100644 index 0000000..98f4a5c Binary files /dev/null and b/public/blog/wp-content/uploads/2011/11/text-formatting-vertical-align.png differ diff --git a/public/blog/wp-content/uploads/2011/12/screen-dynamic-300x157.gif b/public/blog/wp-content/uploads/2011/12/screen-dynamic-300x157.gif new file mode 100644 index 0000000..3a0935c Binary files /dev/null and b/public/blog/wp-content/uploads/2011/12/screen-dynamic-300x157.gif differ diff --git a/public/blog/wp-content/uploads/2011/12/screen-dynamic.gif b/public/blog/wp-content/uploads/2011/12/screen-dynamic.gif new file mode 100644 index 0000000..678f5eb Binary files /dev/null and b/public/blog/wp-content/uploads/2011/12/screen-dynamic.gif differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-combineditems1.png b/public/blog/wp-content/uploads/2012/01/blv-combineditems1.png new file mode 100644 index 0000000..7b1cbb0 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-combineditems1.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-combineditems2.png b/public/blog/wp-content/uploads/2012/01/blv-combineditems2.png new file mode 100644 index 0000000..de68905 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-combineditems2.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1-150x150.png b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1-150x150.png new file mode 100644 index 0000000..06b9cc9 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1-150x150.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1-300x300.png b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1-300x300.png new file mode 100644 index 0000000..08e0607 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1-300x300.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1.png b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1.png new file mode 100644 index 0000000..5d41a5f Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-1.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2-150x150.png b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2-150x150.png new file mode 100644 index 0000000..472a9eb Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2-150x150.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2-300x300.png b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2-300x300.png new file mode 100644 index 0000000..452a2e1 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2-300x300.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2.png b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2.png new file mode 100644 index 0000000..60773c0 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-nonselectable-2.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-readonly-1-300x229.png b/public/blog/wp-content/uploads/2012/01/blv-readonly-1-300x229.png new file mode 100644 index 0000000..586f33a Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-readonly-1-300x229.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-readonly-1.png b/public/blog/wp-content/uploads/2012/01/blv-readonly-1.png new file mode 100644 index 0000000..657f119 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-readonly-1.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-readonly-2-300x229.png b/public/blog/wp-content/uploads/2012/01/blv-readonly-2-300x229.png new file mode 100644 index 0000000..242e35b Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-readonly-2-300x229.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-readonly-2.png b/public/blog/wp-content/uploads/2012/01/blv-readonly-2.png new file mode 100644 index 0000000..f98b9f1 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-readonly-2.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-readonly-3-300x229.png b/public/blog/wp-content/uploads/2012/01/blv-readonly-3-300x229.png new file mode 100644 index 0000000..7c80e13 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-readonly-3-300x229.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-readonly-3.png b/public/blog/wp-content/uploads/2012/01/blv-readonly-3.png new file mode 100644 index 0000000..756d3e5 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-readonly-3.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup1-300x202.png b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup1-300x202.png new file mode 100644 index 0000000..b524a66 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup1-300x202.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup1.png b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup1.png new file mode 100644 index 0000000..8f448ad Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup1.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup2-300x202.png b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup2-300x202.png new file mode 100644 index 0000000..5032977 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup2-300x202.png differ diff --git a/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup2.png b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup2.png new file mode 100644 index 0000000..76a5671 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/blv-showdefaultgroup2.png differ diff --git a/public/blog/wp-content/uploads/2012/01/metadata-view-194x300.png b/public/blog/wp-content/uploads/2012/01/metadata-view-194x300.png new file mode 100644 index 0000000..5f9efe9 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/metadata-view-194x300.png differ diff --git a/public/blog/wp-content/uploads/2012/01/metadata-view.png b/public/blog/wp-content/uploads/2012/01/metadata-view.png new file mode 100644 index 0000000..00209a2 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/01/metadata-view.png differ diff --git a/public/blog/wp-content/uploads/2012/02/blv-invisibleitems-257x300.gif b/public/blog/wp-content/uploads/2012/02/blv-invisibleitems-257x300.gif new file mode 100644 index 0000000..ac91471 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/02/blv-invisibleitems-257x300.gif differ diff --git a/public/blog/wp-content/uploads/2012/02/blv-invisibleitems.gif b/public/blog/wp-content/uploads/2012/02/blv-invisibleitems.gif new file mode 100644 index 0000000..dc0a2e6 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/02/blv-invisibleitems.gif differ diff --git a/public/blog/wp-content/uploads/2012/02/distraction-junkie-coder.png.png b/public/blog/wp-content/uploads/2012/02/distraction-junkie-coder.png.png new file mode 100644 index 0000000..fbf5498 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/02/distraction-junkie-coder.png.png differ diff --git a/public/blog/wp-content/uploads/2012/02/zen-coder.png b/public/blog/wp-content/uploads/2012/02/zen-coder.png new file mode 100644 index 0000000..f45699c Binary files /dev/null and b/public/blog/wp-content/uploads/2012/02/zen-coder.png differ diff --git a/public/blog/wp-content/uploads/2012/03/blv-customheight.png b/public/blog/wp-content/uploads/2012/03/blv-customheight.png new file mode 100644 index 0000000..587488b Binary files /dev/null and b/public/blog/wp-content/uploads/2012/03/blv-customheight.png differ diff --git a/public/blog/wp-content/uploads/2012/03/screen-custom-spacing-150x150.png b/public/blog/wp-content/uploads/2012/03/screen-custom-spacing-150x150.png new file mode 100644 index 0000000..4fd29f5 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/03/screen-custom-spacing-150x150.png differ diff --git a/public/blog/wp-content/uploads/2012/03/screen-custom-spacing.png b/public/blog/wp-content/uploads/2012/03/screen-custom-spacing.png new file mode 100644 index 0000000..f33deed Binary files /dev/null and b/public/blog/wp-content/uploads/2012/03/screen-custom-spacing.png differ diff --git a/public/blog/wp-content/uploads/2012/03/screen-pixel-share-300x158.png b/public/blog/wp-content/uploads/2012/03/screen-pixel-share-300x158.png new file mode 100644 index 0000000..cd3b0ee Binary files /dev/null and b/public/blog/wp-content/uploads/2012/03/screen-pixel-share-300x158.png differ diff --git a/public/blog/wp-content/uploads/2012/03/screen-pixel-share.png b/public/blog/wp-content/uploads/2012/03/screen-pixel-share.png new file mode 100644 index 0000000..92c070b Binary files /dev/null and b/public/blog/wp-content/uploads/2012/03/screen-pixel-share.png differ diff --git a/public/blog/wp-content/uploads/2012/04/blv-embedded-1-300x136.png b/public/blog/wp-content/uploads/2012/04/blv-embedded-1-300x136.png new file mode 100644 index 0000000..c3e198a Binary files /dev/null and b/public/blog/wp-content/uploads/2012/04/blv-embedded-1-300x136.png differ diff --git a/public/blog/wp-content/uploads/2012/04/blv-embedded-1.png b/public/blog/wp-content/uploads/2012/04/blv-embedded-1.png new file mode 100644 index 0000000..fd219b5 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/04/blv-embedded-1.png differ diff --git a/public/blog/wp-content/uploads/2012/04/blv-embedded-2.png b/public/blog/wp-content/uploads/2012/04/blv-embedded-2.png new file mode 100644 index 0000000..026b6fa Binary files /dev/null and b/public/blog/wp-content/uploads/2012/04/blv-embedded-2.png differ diff --git a/public/blog/wp-content/uploads/2012/04/rightalign-group2-300x261.png b/public/blog/wp-content/uploads/2012/04/rightalign-group2-300x261.png new file mode 100644 index 0000000..011148b Binary files /dev/null and b/public/blog/wp-content/uploads/2012/04/rightalign-group2-300x261.png differ diff --git a/public/blog/wp-content/uploads/2012/04/rightalign-group2.png b/public/blog/wp-content/uploads/2012/04/rightalign-group2.png new file mode 100644 index 0000000..fd9d10a Binary files /dev/null and b/public/blog/wp-content/uploads/2012/04/rightalign-group2.png differ diff --git a/public/blog/wp-content/uploads/2012/04/rightalign.png b/public/blog/wp-content/uploads/2012/04/rightalign.png new file mode 100644 index 0000000..c3ac98a Binary files /dev/null and b/public/blog/wp-content/uploads/2012/04/rightalign.png differ diff --git a/public/blog/wp-content/uploads/2012/08/anigif.gif b/public/blog/wp-content/uploads/2012/08/anigif.gif new file mode 100644 index 0000000..ffad706 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/08/anigif.gif differ diff --git a/public/blog/wp-content/uploads/2012/09/custom-selection.png b/public/blog/wp-content/uploads/2012/09/custom-selection.png new file mode 100644 index 0000000..0bedee2 Binary files /dev/null and b/public/blog/wp-content/uploads/2012/09/custom-selection.png differ diff --git a/public/blog/wp-content/uploads/2012/12/chapter-drag-drop.html b/public/blog/wp-content/uploads/2012/12/chapter-drag-drop.html new file mode 100644 index 0000000..a77b0e3 --- /dev/null +++ b/public/blog/wp-content/uploads/2012/12/chapter-drag-drop.html @@ -0,0 +1,580 @@ + + +
+ + + + + + + + + + + + + + + + +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +| + « Drag and Drop | +Index | +Empty Text » + | +
Embedded editing controls can be thought of as an extension to label + edit functionality (see Label + Editing for more information).
+ +Every item and sub-item has a cell area on which + an editing control can be placed. In the simplest case + (LabelEdit set to true), the editing control is + basically a System.Windows.Forms.TextBox control. It is + actually an instance of BetterListViewTextBoxEmbeddedControl, + which is a TextBox wrapper implementing + IBetterListViewEmbeddedControl interface. Any control can be + used as embedded control in Bettter ListView if implements one of these + interfaces:
+ +IBetterListViewEmbeddedControl
+IBetterListViewEmbeddedControlExtended
+The custom embedded control is shown on the image below. When user + clicks on sub-item text (an abbreviation of tea grading), an editing control + appears on the top-left corner of the cell area. The control contains + buttons for accepting and cancelling changes:
+ +
This interface contains prescription for minimum amount of + functionality required by an embedded control:
+ +Get label text for currently edited data.
+Data accepting and cancelling events (e.g. if the control has an + OK button).
+Set control size given the cell area and positioning + data.
+Move data from sub-item to the control.
+Move data from the control to the sub-item.
+Let's make a sample control. We will make a + TextBox-based embedded control for editing words in + lower-case. First, we inherit TextBox and implement + IBetterListViewEmbeddedControl interface:
+ +C#
+/// <summary>
+/// Represents a custom control embeddable in Better ListView.
+/// </summary>
+public class TextBoxEmbeddedControl : TextBox, IBetterListViewEmbeddedControl
+
+ Visual Basic
+''' <summary>
+''' Represents a custom control embeddable in Better ListView.
+''' </summary>
+Public Class TextBoxEmbeddedControl
+ Inherits TextBox
+ Implements IBetterListViewEmbeddedControl
+
+ Then we implement the LabelText property:
+ +C#
+/// <summary>
+/// current (edited) label text
+/// </summary>
+public string LabelText
+{
+ get
+ {
+ return Text.ToLower();
+ }
+}
+
+ Visual Basic
+''' <summary>
+''' current (edited) label text
+''' </summary>
+Public ReadOnly Property LabelText() As String
+ Get
+ Return Text.ToLower()
+ End Get
+End Property
+
+ As you can see, the text of the TextBox is converted to + lower case since we want item/sub-item labels to be only in lower + case.
+ +Next, we implement RequestAccept and + RequestCancel events:
+ +C#
+/// <summary>
+/// request accepting updated data in BetterListView
+/// </summary>
+public event EventHandler RequestAccept;
+
+/// <summary>
+/// request cancelling editing
+/// </summary>
+public event EventHandler RequestCancel;
+
+ Visual Basic
+''' <summary>
+''' request accepting updated data in BetterListView
+''' </summary>
+Public Event RequestAccept As EventHandler Implements IBetterListViewEmbeddedControl.RequestAccept
+
+''' <summary>
+''' request cancelling editing
+''' </summary>
+Public Event RequestCancel As EventHandler Implements IBetterListViewEmbeddedControl.RequestCancel
+
+ Next, we implement GetData and SetData + methods:
+ +C#
+/// <summary>
+/// get data from the specified sub-item in control
+/// </summary>
+/// <param name = "subItem">sub-item whose data are being edited</param>
+public void GetData(BetterListViewSubItem subItem)
+{
+ Text = subItem.Text;
+}
+
+/// <summary>
+/// set data from control to the specified sub-item
+/// </summary>
+/// <param name = "subItem">sub-item whose data are being edited</param>
+public void SetData(BetterListViewSubItem subItem)
+{
+ subItem.Text = LabelText;
+}
+
+ Visual Basic
+''' <summary>
+''' get data from the specified sub-item in control
+''' </summary>
+''' <param name = "subItem">sub-item whose data are being edited</param>
+Public Sub GetData(ByVal subItem As BetterListViewSubItem) Implements IBetterListViewEmbeddedControl.GetData
+
+ Text = subItem.Text
+
+End Sub
+
+''' <summary>
+''' set data from control to the specified sub-item
+''' </summary>
+''' <param name = "subItem">sub-item whose data are being edited</param>
+Public Sub SetData(ByVal subItem As BetterListViewSubItem) Implements IBetterListViewEmbeddedControl.SetData
+
+ subItem.Text = LabelText
+
+End Sub
+
+ These method are trivial since we need not to do any data + conversions (the only conversion here is lowering the case of edited text + in the LabelText getter).
+ +The last method contained in the interface is SetSize + method, which needs not to be implemented (the body can be kept empty). + You implement this method only if you need to adjust control's size when + label edit starts.
+ +The constructor should be implemented like this:
+ +C#
+/// <summary>
+/// Initializes a new instance of the <see cref = "TextBoxEmbeddedControl" /> class.
+/// </summary>
+public TextBoxEmbeddedControl()
+{
+ AcceptsReturn = true;
+ CausesValidation = false;
+}
+
+ Visual Basic
+''' <summary>
+''' Initializes a new instance of the <see cref = "TextBoxEmbeddedControl" /> class.
+''' </summary>
+Public Sub New()
+
+ AcceptsReturn = True
+ CausesValidation = False
+
+End Sub
+
+ The AcceptsReturn property is set to true + because we will handle the ENTER key (and raise + RequestAccept event appropriately).
+ +The CausesValidation property is set to + false because it is a good practice in this situation.
+ +Both input and output data are validated in the + IBetterListViewEmbeddedControl implementation and validation + of some third-party controls can prevent whole form with the control from + closing.
+ +The last thing we implement is handling of the + ENTER key for accepting the data and the + ESCAPE key for cancelling:
+ +C#
+protected override void OnKeyDown(KeyEventArgs e)
+{
+ if (e.KeyCode == Keys.Enter &&
+ RequestAccept != null)
+ {
+ RequestAccept(this, EventArgs.Empty);
+
+ e.Handled = true;
+
+ return;
+ }
+
+ if (e.KeyCode == Keys.Escape &&
+ RequestCancel != null)
+ {
+ RequestCancel(this, EventArgs.Empty);
+
+ e.Handled = true;
+
+ return;
+ }
+
+ base.OnKeyDown(e);
+}
+
+ Visual Basic
+Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
+
+ If e.KeyCode = Keys.Enter AndAlso RequestAccept IsNot Nothing Then
+
+ RequestAccept(Me, EventArgs.Empty)
+
+ e.Handled = True
+
+ Return
+
+ End If
+
+ If e.KeyCode = Keys.Escape AndAlso RequestCancel IsNot Nothing Then
+
+ RequestCancel(Me, EventArgs.Empty)
+
+ e.Handled = True
+
+ Return
+
+ End If
+
+ MyBase.OnKeyDown(e)
+
+End Sub
+
+ It is a common good practice to implement interfaces explicitly. + The sample implementation is implicit for the sake of better + readability. Embedded controls implemented in BetterListView.dll are + implemented implicitly (and marked virtual) to allow for being inherited + (e.g. MyCustomControl : BetterListViewEmbeddedControl) and + you may possibly want to override any part of the interface + implementation.
+The extended interface has currently only one method called + RequestEndEdit. This method can be called by the Better + ListView, when it asks the control whether it is ready to end editing. The + control can return a boolean value (true - continue + EndEdit, false - refuse to end editing). There + are many situations when the label editing is terminated (e.g. scrolling + the control, selecting items...) and terminating the label edit is not + always wanted (this is a case of + System.Windows.Forms.DateTimePicker control, which sometimes + behaves as being transparent for mouse clicks and thus being closed + because of click-through on the Better ListView client area - the + RequestEndEdit method fixes such possible behavior of third + party controls).
+ + +Form with Better ListView containing some columns and items:
+ +C#
+/// <summary>
+/// Shows embedding of custom controls into Better ListView.
+/// </summary>
+internal sealed partial class EmbeddedControlSampleForm : Form
+{
+ /// <summary>
+ /// Initializes a new instance of the <see cref = "EmbeddedControlSampleForm" /> class.
+ /// </summary>
+ public EmbeddedControlSampleForm()
+ {
+ InitializeComponent();
+
+ this.listView.BeginUpdate();
+
+ this.listView.Columns.AddRange(new[]
+ {
+ new BetterListViewColumnHeader("Document name", 160),
+ new BetterListViewColumnHeader("Access", 128)
+ });
+
+ this.listView.Items.AddRange(
+ new[]
+ {
+ new BetterListViewItem(new[] { "hydro-report.pdf", "read" }),
+ new BetterListViewItem(new[] { "magnetic_resonance.docx", "read write" }),
+ new BetterListViewItem(new[] { "billing forms (2011).zip", "read" })
+ });
+
+ this.listView.LabelEditActivation = (BetterListViewLabelEditActivation.Keyboard | BetterListViewLabelEditActivation.SingleClick);
+ this.listView.LabelEditModeSubItems = BetterListViewLabelEditMode.CustomControl;
+
+ this.listView.EndUpdate();
+
+ this.listView.RequestEmbeddedControl += ListViewRequestEmbeddedControl;
+ }
+
+ private IBetterListViewEmbeddedControl ListViewRequestEmbeddedControl(object sender, BetterListViewRequestEmbeddedControlEventArgs eventArgs)
+ {
+ if (eventArgs.SubItem.Index == 1)
+ {
+ return (new DocumentAccessConrol());
+ }
+
+ return null;
+ }
+}
+
+ Visual Basic
+''' <summary>
+''' Shows embedding of custom controls into Better ListView.
+''' </summary>
+Partial Friend NotInheritable Class EmbeddedControlSampleForm
+
+ ''' <summary>
+ ''' Initializes a new instance of the <see cref = "EmbeddedControlSampleForm" /> class.
+ ''' </summary>
+ Public Sub New()
+
+ InitializeComponent()
+
+ ListView.BeginUpdate()
+
+ ListView.Columns.AddRange(
+ New BetterListViewColumnHeader() { _
+ New BetterListViewColumnHeader("Document name", 160),
+ New BetterListViewColumnHeader("Access", 128)
+ })
+
+ ListView.Items.AddRange(
+ New BetterListViewItem() { _
+ New BetterListViewItem(New String() {"hydro-report.pdf", "read"}),
+ New BetterListViewItem(New String() {"magnetic_resonance.docx", "read write"}),
+ New BetterListViewItem(New String() {"billing forms (2011).zip", "read"})
+ })
+
+ ListView.LabelEditActivation =
+ (BetterListViewLabelEditActivation.Keyboard Or BetterListViewLabelEditActivation.SingleClick)
+ ListView.LabelEditModeSubItems = BetterListViewLabelEditMode.CustomControl
+
+ ListView.EndUpdate()
+
+ AddHandler ListView.RequestEmbeddedControl, AddressOf ListViewRequestEmbeddedControl
+
+ End Sub
+
+ Private Function ListViewRequestEmbeddedControl(ByVal sender As Object,
+ ByVal eventArgs As BetterListViewRequestEmbeddedControlEventArgs) _
+ As IBetterListViewEmbeddedControl
+
+ If eventArgs.SubItem.Index = 1 Then
+ Return (New DocumentAccessConrol())
+ End If
+
+ Return Nothing
+
+ End Function
+
+End Class
+
+ DocumentAccessControl class used as complex embedded + control (see EmbeddedControlSampleForm sample in the provided + C# and Visual Basic samples for full source code):
+ +C#
+/// <summary>
+/// Represents a custom control embeddable in Better ListView.
+/// </summary>
+[ToolboxItem(false)]
+internal sealed partial class DocumentAccessConrol : UserControl, IBetterListViewEmbeddedControl
+{
+ private const string StringRead = "read";
+ private const string StringWrite = "write";
+
+ /// <summary>
+ /// current (edited) label text
+ /// </summary>
+ public string LabelText
+ {
+ get
+ {
+ // convert control's state to label
+ if (this.checkBoxRead.Checked &&
+ this.checkBoxWrite.Checked)
+ {
+ return String.Format("{0} {1}", StringRead, StringWrite);
+ }
+
+ if (this.checkBoxRead.Checked)
+ {
+ return StringRead;
+ }
+
+ if (this.checkBoxWrite.Checked)
+ {
+ return StringWrite;
+ }
+
+ return String.Empty;
+ }
+ }
+
+ /// <summary>
+ /// request accepting updated data in BetterListView
+ /// </summary>
+ public event EventHandler RequestAccept;
+
+ /// <summary>
+ /// request cancelling editing
+ /// </summary>
+ public event EventHandler RequestCancel;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref = "DocumentAccessConrol" /> class.
+ /// </summary>
+ public DocumentAccessConrol()
+ {
+ InitializeComponent();
+
+ //NOTE: disabling validation prevents form close cancellation
+ CausesValidation = false;
+
+ foreach (Control control in Controls)
+ {
+ control.LostFocus += ControlOnLostFocus;
+ }
+ }
+
+ /// <summary>
+ /// get data from the specified sub-item in control
+ /// </summary>
+ /// <param name = "subItem">sub-item whose data are being edited</param>
+ public void GetData(BetterListViewSubItem subItem)
+ {
+ // convert label to control's state
+ this.checkBoxRead.Checked = subItem.Text.Contains(StringRead);
+ this.checkBoxWrite.Checked = subItem.Text.Contains(StringWrite);
+ }
+
+ /// <summary>
+ /// set data from control to the specified sub-item
+ /// </summary>
+ /// <param name = "subItem">sub-item whose data are being edited</param>
+ public void SetData(BetterListViewSubItem subItem)
+ {
+ subItem.Text = LabelText;
+ }
+
+ /// <summary>
+ /// set control size
+ /// </summary>
+ /// <param name = "subItem">sub-item whose data are being edited</param>
+ /// <param name = "placement">placement of the embedded control within sub-item</param>
+ public void SetSize(BetterListViewSubItem subItem, BetterListViewEmbeddedControlPlacement placement)
+ {
+ // keep size of the control unchanged
+ }
+
+ private void ControlOnLostFocus(object sender, EventArgs eventArgs)
+ {
+ //
+ // NOTE: this code is needed just for hiding embedded control with sub-controls when user changes active form while label editing
+ //
+ bool anyFocused = Focused;
+
+ if (anyFocused == false)
+ {
+ foreach (Control control in Controls)
+ {
+ if (control.Focused)
+ {
+ anyFocused = true;
+
+ break;
+ }
+ }
+ }
+
+ if (anyFocused == false)
+ {
+ RequestAccept(this, eventArgs);
+ }
+ }
+
+ private void ButtonOKClick(object sender, EventArgs e)
+ {
+ RequestAccept(this, e);
+ }
+
+ private void ButtonCancelClick(object sender, EventArgs e)
+ {
+ RequestCancel(this, e);
+ }
+}
+
+ Visual Basic
+''' <summary>
+''' Represents a custom control embeddable in Better ListView.
+''' </summary>
+<ToolboxItem(False)>
+Partial Friend NotInheritable Class DocumentAccessConrol
+ Inherits UserControl
+ Implements IBetterListViewEmbeddedControl
+
+ Private Const StringRead As String = "read"
+ Private Const StringWrite As String = "write"
+
+ ''' <summary>
+ ''' current (edited) label text
+ ''' </summary>
+ Public ReadOnly Property LabelText() As String Implements IBetterListViewEmbeddedControl.LabelText
+ Get
+ ' convert control's state to label
+ If CheckBoxRead.Checked AndAlso CheckBoxWrite.Checked Then
+ Return [String].Format("{0} {1}", StringRead, StringWrite)
+ End If
+
+ If CheckBoxRead.Checked Then
+ Return StringRead
+ End If
+
+ If CheckBoxWrite.Checked Then
+ Return StringWrite
+ End If
+
+ Return [String].Empty
+ End Get
+ End Property
+
+ ''' <summary>
+ ''' request accepting updated data in BetterListView
+ ''' </summary>
+ Public Event RequestAccept As EventHandler Implements IBetterListViewEmbeddedControl.RequestAccept
+
+ ''' <summary>
+ ''' request cancelling editing
+ ''' </summary>
+ Public Event RequestCancel As EventHandler Implements IBetterListViewEmbeddedControl.RequestCancel
+
+ ''' <summary>
+ ''' Initializes a new instance of the <see cref = "DocumentAccessConrol" /> class.
+ ''' </summary>
+ Public Sub New()
+
+ InitializeComponent()
+
+ 'NOTE: disabling validation prevents form close cancellation
+ CausesValidation = False
+
+ For Each control As Control In Controls
+ AddHandler control.LostFocus, AddressOf ControlOnLostFocus
+ Next
+
+ End Sub
+
+ ''' <summary>
+ ''' get data from the specified sub-item in control
+ ''' </summary>
+ ''' <param name = "subItem">sub-item whose data are being edited</param>
+ Public Sub GetData(ByVal subItem As BetterListViewSubItem) Implements IBetterListViewEmbeddedControl.GetData
+
+ ' convert label to control's state
+ CheckBoxRead.Checked = subItem.Text.Contains(StringRead)
+ CheckBoxWrite.Checked = subItem.Text.Contains(StringWrite)
+
+ End Sub
+
+ ''' <summary>
+ ''' set data from control to the specified sub-item
+ ''' </summary>
+ ''' <param name = "subItem">sub-item whose data are being edited</param>
+ Public Sub SetData(ByVal subItem As BetterListViewSubItem) Implements IBetterListViewEmbeddedControl.SetData
+
+ subItem.Text = LabelText
+
+ End Sub
+
+ ''' <summary>
+ ''' set control size
+ ''' </summary>
+ ''' <param name = "subItem">sub-item whose data are being edited</param>
+ ''' <param name = "placement">placement of the embedded control within sub-item</param>
+ Public Sub SetSize(ByVal subItem As BetterListViewSubItem,
+ ByVal placement As BetterListViewEmbeddedControlPlacement) _
+ Implements IBetterListViewEmbeddedControl.SetSize
+
+ ' keep size of the control unchanged
+
+ End Sub
+
+ Private Sub ControlOnLostFocus(ByVal sender As Object, ByVal eventArgs As EventArgs)
+
+ '
+ ' NOTE: this code is needed just for hiding embedded control with sub-controls when user changes active form while label editing
+ '
+ Dim anyFocused As Boolean = Focused
+
+ If anyFocused = False Then
+ For Each control As Control In Controls
+ If control.Focused Then
+ anyFocused = True
+
+ Exit For
+ End If
+ Next
+ End If
+
+ If anyFocused = False Then
+ RaiseEvent RequestAccept(Me, eventArgs)
+ End If
+
+ End Sub
+
+ Private Sub ButtonOKClick(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonOK.Click
+ RaiseEvent RequestAccept(Me, e)
+ End Sub
+
+ Private Sub ButtonCancelClick(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonCancel.Click
+ RaiseEvent RequestCancel(Me, e)
+ End Sub
+
+End Class
+
+| + « Drag and Drop | +Index | +Empty Text » + | +
| Better ListView Documentation + | ++ Copyright © 2010-2012 ComponentOwl.com + | +
Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +| + « Saving and Loading ListView Content | +Index | +Serialization » + | +
Better ListView offers many options for searching items by typing on + keyboard and programmaticaly (FindItemWithText, + FindItemsWithText methods). Search can be extended to sub-items + and event multiple items can be contained in a search result.
+ +Search can be customized with SearchSettings property. + This structure contains three other properties:
+ +Specifies how the searching is done on each item/sub-item + string.
+ +Searching is disabled.
+Search is restricted to text prefix.
+Search query can match any substring, if nothing found by + prefix.
+Search query can match any substring.
+Additional options for searching.
+ +The search is case-sensitive.
+Search is restricted to the first word of searched + text.
+No options active.
+Sound is played, when nothing is found.
+Results matched by prefix are prefered among other (e.g. + when searching for pla, then the text + player is prefered among the word + applause).
+Restrict the search to selectable items only.
+Searched text si first split into words and searching is + done on each word separately.
+Specifies sub-items on which the search is done; if the + collection is empty, than all sub-items are searched.
+There is a default one-second delay to register when user stopped + typing and the search is discarded. A new search is initiated when user + starts typing after this interval has passed. This interval can be set via + SearchTimeoutDelay property.
+ +The delay is not relevant when user types the same letter several + times and there are other items beginning with that letter. If there are + items named ab, ac, + ad, then the selection cycles through these items as + long as the user keeps pressing A key. This works + essentialy the same way as in the Windows Explorer.
+ +The keyboard search works, of course, only when the control has + focus. You can ensure this (e.g. when showing the form) by calling + Focus method on Better ListView.
+C#
+this.listView.BeginUpdate();
+
+// fill the ListView with items in two columns
+this.listView.Columns.AddRange(
+ new[]
+ {
+ new BetterListViewColumnHeader("Word", 128),
+ new BetterListViewColumnHeader("Synonym List", 160)
+ });
+
+this.listView.Items.AddRange(
+ new[]
+ {
+ new BetterListViewItem(new[] { "apparently", "evidently, presumably, seemingly" }),
+ new BetterListViewItem(new[] { "blunt", "brusque, curt, snippy" }),
+ new BetterListViewItem(new[] { "class", "caste, estate, folk" }),
+ new BetterListViewItem(new[] { "detailed", "elaborate, full, thorough" }),
+ });
+
+// search in substrings
+BetterListViewSearchMode searchMode = BetterListViewSearchMode.Substring;
+
+// use case-sensitive searching and play sounds
+BetterListViewSearchOptions searchOptions = (BetterListViewSearchOptions.CaseSensitive | BetterListViewSearchOptions.PlaySound);
+
+// search in the first and second column
+//NOTE: empty array also means searching in all columns
+int[] subItemIndices = new[] { 0, 1 };
+
+// set-up the search
+this.listView.SearchSettings = new BetterListViewSearchSettings(searchMode, searchOptions, subItemIndices);
+
+this.listView.EndUpdate();
+
+ Visual Basic
+ListView.BeginUpdate()
+
+' fill the ListView with items in two columns
+ListView.Columns.AddRange(
+ New BetterListViewColumnHeader() { _
+ New BetterListViewColumnHeader("Word", 128),
+ New BetterListViewColumnHeader("Synonym List", 160)
+ })
+
+ListView.Items.AddRange(
+ New BetterListViewItem() { _
+ New BetterListViewItem(New String() _
+ {"apparently", "evidently, presumably, seemingly"}),
+ New BetterListViewItem(New String() {"blunt", "brusque, curt, snippy"}),
+ New BetterListViewItem(New String() {"class", "caste, estate, folk"}),
+ New BetterListViewItem(New String() {"detailed", "elaborate, full, thorough"})
+ })
+
+' search in substrings
+Dim searchMode As BetterListViewSearchMode = BetterListViewSearchMode.Substring
+
+' use case-sensitive searching and play sounds
+Dim searchOptions As BetterListViewSearchOptions =
+ (BetterListViewSearchOptions.CaseSensitive Or BetterListViewSearchOptions.PlaySound)
+
+' search in the first and second column
+'NOTE: empty array also means searching in all columns
+Dim subItemIndices As Integer() = New Integer() {0, 1}
+
+' set-up the search
+ListView.SearchSettings = New BetterListViewSearchSettings (searchMode, searchOptions, subItemIndices)
+
+ListView.EndUpdate()
+
+| + « Saving and Loading ListView Content | +Index | +Serialization » + | +
| Better ListView Documentation + | ++ Copyright © 2010-2012 ComponentOwl.com + | +
Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +| + « Multi-line Items | +Index | +Performance » + | +
Owner drawing allow to customize appearance of any element, element + part and the control itself:
+ +
The simple way to draw over control parts is by using drawing + events:
+ +DrawBackground
+DrawColumnHeader
+DrawColumnHeaderBackground
+DrawGroup
+DrawGroupBackground
+DrawItem
+DrawItemBackground
+DrawInsertionMark
+Each of these events contains System.Drawing.Graphics + object in event data with which custom drawing is possible. Areas of + drawing are also provided. For example, to draw inside item inner area, + there is a + BetterListViewDrawItemEventArgs.ItemBounds.BoundsInner + property containing the rectangle.
+ +If you want to paint outside element areas, set + OptimizedInvalidation property to false. This + will ensure your custom drawing code will be called in every redraw + cycle.
+Owner drawing events are always called after the default drawing, so + it is possible only to draw over exisiting drawing. When you need turn off + some painting and do your own drawing instead of the default one (e.g. + draw rotated text instead the straight one), you have to create your + custom control inheriting from BetterListView:
+ +C#
+class OwnerDrawBetterListView : BetterListView
+{
+ // ...
+}
+
+ Visual Basic
+Class OwnerDrawBetterListView Inherits BetterListView
+ ' ...
+End Class
+
+ Then you can override one of the drawing methods:
+ +OnDrawBackground
+OnDrawColumnHeader
+OnDrawGroup
+OnDrawGroupBackground
+OnDrawItem
+OnDrawItemBackground
+OnDrawInsertionMark
+This gives you more control over the painting, because your drawing + code can be called before or + after the default drawing, depending on where and if + you call base implementation.
+ +Every part of the default drawing has a switch so you can turn the + default drawing off. For example, if you want not to draw default text on + some item, set BetterListViewDrawItemEventArgs.DrawText + property to false.
+ +It is also possible to do custom drawing as the very last drawing of + the whole control. To do this, override DrawingRedrawCore + method and do your drawing after calling the base implementation:
+ +C#
+protected override void DrawingRedrawCore(Graphics grfx)
+{
+ base.DrawingRedrawCore(grfx);
+
+ // do your custom drawing
+}
+
+ Visual Basic
+Protected Overrides Sub DrawingRedrawCore(grfx As Graphics)
+
+ MyBase.DrawingRedrawCore(grfx)
+
+ ' do your custom drawing
+
+End Sub
+
+
+ The appearance of element depends not only on its state, but also on + the control state.
+ +If you override one of the drawing methods (e.g. + OnDrawItem), you can modify event data before calling base + class implementation (e.g. base.OnDrawItem).
+ +For example, BetterListViewDrawItemEventArgs contains + ItemStateInfo property. By modifying this property, you can + force drawing item in any state you wish.
+ +BetterListViewDrawItemEventArgs also contains two + properties regarding control state:
+ +Draw item as if the control is in enabled state + (BetterListView.Enabled is true).
+Draw item as if the control in in focused state + (BetterListView.Focused is true).
+By default, these properties correspond to actual control's state, + but they can be modified. For example, one may want to set + DrawFocused to true on every item that is selected, so the + item will be highlighted even if the control loses focus.
+ +The control state properties are available only in the + BetterListViewItemEventArgs, but element states can be + modified in all painting event handlers (also column headers and + groups).
+ + +The following sample shows owner drawing of item background:
+ +C#
+this.listView.BeginUpdate();
+
+this.listView.Items.Add("Item with owner-drawn image and background.");
+
+this.listView.View = BetterListViewView.Tile;
+// turn off automatic image sizing to make space for image even when items do not have any images set
+this.listView.LayoutOptions = (BetterListViewLayoutOptions.Auto & ~BetterListViewLayoutOptions.AutoSizeItemImage);
+// set 4-pixel boundary around image
+this.listView.LayoutItemsCurrent.ImagePadding = new Padding(4);
+// set image size to be 50 by 50 pixels (it is possible to set image sizes for sub-items as well by adding more Size instances in the collection)
+this.listView.LayoutItemsCurrent.ImageSizes = new ReadOnlyCollection<Size>(new[] { new Size(50, 50) });
+
+this.listView.EndUpdate();
+
+// we would like to draw over item's foreground (custom image)
+this.listView.DrawItem += ListViewDrawItem;
+// we would like to draw over item's background
+this.listView.DrawItemBackground += ListViewDrawItemBackground;
+
+ Visual Basic
+ListView.BeginUpdate()
+
+ListView.Items.Add("Item with owner-drawn image and background.")
+
+ListView.View = BetterListViewView.Tile
+' turn off automatic image sizing to make space for image even when items do not have any images set
+ListView.LayoutOptions = (BetterListViewLayoutOptions.Auto And Not BetterListViewLayoutOptions.AutoSizeItemImage)
+' set 4-pixel boundary around image
+ListView.LayoutItemsCurrent.ImagePadding = New Padding(4)
+' set image size to be 50 by 50 pixels (it is possible to set image sizes for sub-items as well by adding more Size instances in the collection)
+ListView.LayoutItemsCurrent.ImageSizes = New ReadOnlyCollection(Of Size)(New Size() {New Size(50, 50)})
+
+ListView.EndUpdate()
+
+' we would like to draw over item's foreground (custom image)
+AddHandler ListView.DrawItem, AddressOf ListViewDrawItem
+' we would like to draw over item's background
+AddHandler ListView.DrawItemBackground, AddressOf ListViewDrawItemBackground
+
+ DrawItem event handler draws on the item image + area:
+ +C#
+void ListViewDrawItem(object sender, BetterListViewDrawItemEventArgs eventArgs)
+{
+ eventArgs.Graphics.SmoothingMode = SmoothingMode.HighQuality;
+
+ Pen pen = new Pen(Color.BlueViolet, 2.5f);
+
+ // draw ellipse in the image area
+ eventArgs.Graphics.DrawEllipse(
+ pen,
+ eventArgs.ItemBounds.SubItemBounds[0].BoundsImage);
+
+ pen.Dispose();
+}
+
+ Visual Basic
+Sub ListViewDrawItem(ByVal sender As Object, ByVal eventArgs As BetterListViewDrawItemEventArgs)
+
+ eventArgs.Graphics.SmoothingMode = SmoothingMode.HighQuality
+
+ Dim pen As New Pen(Color.BlueViolet, 2.5F)
+
+ ' draw ellipse in the image area
+ eventArgs.Graphics.DrawEllipse(pen, eventArgs.ItemBounds.SubItemBounds(0).BoundsImage)
+
+ pen.Dispose()
+
+End Sub
+
+ DrawItemBackground event handler draws on the item + background area:
+ +C#
+void ListViewDrawItemBackground(object sender, BetterListViewDrawItemBackgroundEventArgs eventArgs)
+{
+ Brush brush = new LinearGradientBrush(
+ eventArgs.ItemBounds.BoundsInner,
+ Color.FromArgb(64, Color.DarkSeaGreen),
+ Color.Transparent,
+ LinearGradientMode.ForwardDiagonal);
+
+ // draw over the item's background in the inner area
+ eventArgs.Graphics.FillRectangle(brush, eventArgs.ItemBounds.BoundsInner);
+
+ brush.Dispose();
+}
+
+ Visual Basic
+Sub ListViewDrawItemBackground(ByVal sender As Object, ByVal eventArgs As BetterListViewDrawItemBackgroundEventArgs)
+
+ Dim brush As Brush = New LinearGradientBrush(
+ eventArgs.ItemBounds.BoundsInner,
+ Color.FromArgb(64, Color.DarkSeaGreen),
+ Color.Transparent,
+ LinearGradientMode.ForwardDiagonal)
+
+ ' draw over the item's background in the inner area
+ eventArgs.Graphics.FillRectangle(brush, eventArgs.ItemBounds.BoundsInner)
+
+ brush.Dispose()
+
+End Sub
+
+| + « Multi-line Items | +Index | +Performance » + | +
| Better ListView Documentation + | ++ Copyright © 2010-2012 ComponentOwl.com + | +
Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.
+ +Seamless integration with .NET 2.0 and higher
+ +Libor Tinka, Lead Developer, ComponentOwl.com
- +1. Introduction
2. Prerequisites
@@ -276,69 +276,69 @@ that you will be able to impement the one that suits you best.
I have created a very simple control called SampleControl:
-

Finally, I set version of the assembly 3.3.0.0 (I chose just something else than 1.0.0.0 to see where the specific version number appears).
![]()
![]()
The icon file should have same name as the control class (i.e. SampleControl.BMP).
Finally, use ToolboxBitmapAttribute to link icon with the control class:
@@ -432,7 +432,7 @@ public partial class SampleControl : UserControl the icon under custom folder named Resources, I need to reference Resources.SampleControl.bmp instead of just SampleControl.bmp.Here is the resulting transparent icon in Toolbox:
-

We can mark control as toolbox item by adding a ToolboxItemAttribute with defaultType parameter set to true:
@@ -454,7 +454,7 @@ Installer approach requires the assembly being installed in GAC, hence the strong name is necessary there.To give an assembly a strong name, open project properties and find Signing tab:
-

Check the "Sign the assembly" option and select "<New...>" from the combo box. This will create a new .SNK file in your project which will be used to sign the assembly. You can also browse for existing key file. If you @@ -472,9 +472,9 @@ identification.
To install component into Visual Studio Toolbox manually, open some form or control in designer, open the Toolbox window (Control+Alt+X), right-click on the Toolbox window and select "Choose Items...":
-

The "Choose Toolbox Items" dialog will show up:
-

You can browse for DLL file with your component by clicking the "Browse..." button.
This is the simplest way of putting component in the Toolbox without extra @@ -502,7 +502,7 @@ subkey named "Toolbox" with single string value "TabNam tab name as data. When you add such control in the Toolbox, it will reside under new tab with the specified name:
-
The control should also appear in "Choose Toolbox Items" dialog box if it is installed in Global Assembly Cache.
The control pops up in the Toolbox automatically in @@ -565,7 +565,7 @@ newer version.
If you have added the component from GAC (these components also appear in the "Choose Toolbox Items" dialog box), the "Specific Version" property of the reference is true by default:
-

This means that even if you install a newer version of the component in GAC, the project will still reference the older version and both versions will reside in GAC.
@@ -590,7 +590,7 @@ components into the Toolbox. Visual Studio and delete all .TBD files in the following folder:\Users\<user>\AppData\Local\Microsoft\VisualStudio\10.0\
It should be up to four files:
-

Once removed, start Visual Studio again. After showing the Toolbox, all items should load instead of loading only the cached versions.
The installation consists of putting the control in GAC (see previous section for more information) and creating registry keys.
Suppose we have the SampleControl installed in GAC:
-

We will make reference to this assembly from registry by creating the following key:
32-bit OS: HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\ToolboxControlsInstaller\SampleControl, Version=3.7.0.0, Culture=neutral, PublicKeyToken=3cc4c7b61201d46c @@ -760,19 +760,19 @@ Studio 2005, 2008 and 2010) or "2.0" (support for Visual Studio 2008, 2010, 2012, 2013).Now we zip the two files and rename extension of the archive to .VSI. We should end up with the following three files:
-+
If you double-click the SampleControl.vsi, the Visual Studio Content Installer opens up. You can start the installer from command line as well:
32-bit OS: C:\Program Files\Common Files\Microsoft Shared\MSEnv\VSContentInstaller.exe SampleControl.vsi 64-bit OS: C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSContentInstaller.exe SampleControl.vsiThe installer have a form o wizard:
-+
Signing the VSI Package
By default, the VSI package is not signed. This causes showing: "Publisher: Unknown" label on the first page of the installation wizard and an unpleasant dialog box later on:
-+
To avoid this, you need to digitally sign the VSI package. Of course, you have to own a digital certificate (usually an X.509 certificate stored in .PFX file).
@@ -806,7 +806,7 @@ programmatically. You need to delete the control's DLL located at component will not be found and disappear. Similarly, you can just delete the control from the Toolbox or select "Choose Items..." from context menu and untick the control there: -+
![]()
![]()
Drawbacks of Using VSI Package
One drawback of using VSI package is that the installer runs every version of VS IDE you have installed and which is supported by the package. The form will @@ -816,7 +816,7 @@ offers whether to rename, replace or skip the file (e.g. SampleControl.dll). Use update, which also slows down installation and requires user interaction.
You also cannot specify custom Toolbox tab. All controls are installed under "My Controls" tab:
-+
8. Toolbox Integration using VSPackages
This approach brings full control over the integration and other benefits. The VSPackages are loaded on-demand, so the integration process won't slow down a custom installer.
@@ -830,13 +830,13 @@ previously). and 2013, so we will work in Visual Studio 2010.Select "File - New - Project.." (Control+Shift+N) and select the "Visual Studio Package" template:
-+
![]()
![]()
This will start a "Visual Studio Package Wizard":
-+
You can leave most options in the wizard on defaults. Leave all the check boxes unchecked on "Page 3 of 7" and "Page 7 of 7":
--
+
+
Now we will take a look on the generated files. Open the Guids.cs file:
@@ -868,7 +868,7 @@ Visual Studio's point of view.Another important file here is source.extension.vsixmanifest. If you double-click on the file in Solution Explorer, the VSIX Manifest Designer will show up:
-+
Not all the fields are mandatory, but I will fill all of them nevertheless:
We have specified supported Visual Studio Editions in VSIX Manifest Designer, through the "Visual Studio Version and Edition" dialog box:
-

As you can see, only Visual Studio 2010 is supported here because VSIX is new to 2010 and of course VS 2010 does not know about 2012/2013. We have to source.extensions.vsixmanifest file for manual editing. Select the file @@ -974,7 +974,7 @@ attributes:
InstalledProductRegistrationAttribute refer to keys in VSPackage.resx. You can open this file and edit package name and description there: -

Now we write methods within SampleVsPackage class that work with the Toolbox:
private const string ComponentFile = "SampleControl.dll"; @@ -1021,7 +1021,7 @@ order to use ToolboxService.Building the Package
Before building the SampleVsPackage project, open project properties, find the VSIX tab and uncheck all the options:
-+
Finally, build the project. Just two files, SampleVsPackage.dll and SampleVsPackage.pdb, should be generated.
Registering the Package
@@ -1056,7 +1056,7 @@ Assembly.CodeBase property for more information). that your VSPackage assembly is located in GAC (Global Assembly Cache). See section Installing the Control in GAC for more information.You can check out the registry after the package registration:
-+
Package Registration for Visual Studio 2012/2013
Regrettably, simply registering package is not enough for Visual Studio 2012/2013 to load it (see this @@ -1110,7 +1110,7 @@ just call "devenv.exe /Setup".
Windows Forms Designer and show Toolbox (Cotrol+Alt+X). You can notice your package name displaying in status bar for a while, then SampleControl should show up in the Toolbox under "Component Owl" tab: -+
Displaying Your Extension in VS About Box
If you want information about your extension to be visible in Visual Studio splash screen and About Box, implement IVsInstalledProduct @@ -1159,15 +1159,15 @@ public sealed class SampleVsPackage : Package, IVsInstalledProduct
This code causes the component to show up in the list of "Installed Products" in Visual Studio about box:
-

As for the splash screen, Visual Studio 2008 used to display extensions in its splash screen, but later version do not:
-
-
-
+
+
You may encounter this dialog when playing with packages:
-

When you click "No", the package will be skipped later when loading packages. You can re-enable loading all packages by running
devenv.exe /ResetSkipPkgs@@ -1209,11 +1209,11 @@ PLKs removed), so we won't discuss this topic in more depth
Suppose we have already integrated SampleControl version 3.3.0.0 in the Visual Sudio Toolbox:
-

We would like to update this control to version 3.4.0.0.
First of all, we update assembly information of the SampleControl project:
-

If we "deploy" (copy) SampleControl.dll to the folder with SampleVsPackage.dll where it is registered, the SampleControl will no longer be visible in Toolbox, because the control in Toolbox should still be 3.3.0.0 and @@ -1232,9 +1232,9 @@ public sealed class SampleVsPackage : Package, IVsInstalledProduct
The package need to be re-registered (see section Registering the Package) which will effectively update just the "Default Items" value in the Toolbox key:
-

This will cause Visual Studio to update your control in the Toolbox:
-

Now we would like to remove control from the Visual Studio Toolbox. This step can be done by custom uninstaller.
@@ -1263,7 +1263,7 @@ package project with control from a template.Select "File - New - Project.." (Control+Shift+N) and then select the "Windows Forms Toolbox Control" or "WPF Toolbox Control" template:
-

The projects is basically a VSPackage wrapped in VSIX container after build. The package assembly also contain the control class named ToolboxControl.
@@ -1286,11 +1286,11 @@ to "Windows Forms Toolbox Control" template to show you all the differences. the same as in previous chapter.Project properties differs from VSPackage we have created earlier on the VSIX tab, where we have the first two check boxes checked:
-

Double-click on the source.extension.vsixmanifest file to open up the VSIX Manifest Designer:
-

If you are not sure about some part of the form, please take a look on section Create VSPackage Project, where the form is described in more detail.
@@ -1381,13 +1381,13 @@ public sealed class ProvideToolboxControlAttribute : RegistrationAttributeThis code is generated if you create project from template.
The project in Solution Explorer should look like this:
-
What if we would like to use SampleControl.dll as in the VSI package scenario?
Of course, we can click "Add Content" in the VSIX Manifest designer and simply add "Toolbox Control" content from other project:
-

However, this is possible only if the SampleControl project itself is a package project!
Lucklily, since the VSIX package is still just a ZIP archive, we can take a @@ -1403,14 +1403,14 @@ SampleVsixPackage.vsix file. This is our VSIX package.
usually possible to just double-click on the file and see the VSIX installer.The installation can fail in the very first step:
-

This problem appears if you have invalid manifest file. If this happen, open source.extension.vsixmanifest and fill in all missing data. Furthermore, you can check if the XML is valid according to VSIX Extension Schema.
Now we are able to rebuild and run the VSIX installer again:
-

To make our VSIX package working with Visual Studio 2012 and newer, we need to manually update the manifest file. Select the @@ -1459,7 +1459,7 @@ VisualStudio element with higher version and all the editions (they are relevant for VS 2012 and 2013 as its own template also generates these).
The VSIX installer will show Visual Studio 2012 options as well after this update (if installed, of course):
-

Please note that Visual Studio 2012/2013 also works with 2.0 version of the schema, so if you create VSIX package in Visual Studio 2012/2013, it won't be compatible with 2010. The solution is hence to use 1.0 version of the schema @@ -1469,7 +1469,7 @@ really fast with VSIX.
Regrettably, the control won't show up in Visual Studio 2012/2013 Toolbox in its default configuration. You need to enable loading-per user extensions (this option is enabled by default in Visual Studio 2010):
-

Unlike older VSI package, there is no nag screen when the package is not signed. Instead, a label appears informing user that the package is not @@ -1535,7 +1535,7 @@ internal class Program
SignVsix.exe SampleVsixPackage.vsix certificate.pfx abc123
When the file is signed, VSIX Installer shows label "Digital Signature: <Author Name>" on the first page:
-

If you look on the project references, you can see reference to Microsoft.VisualStudio.Shell.Immutable.10. This reference points to @@ -1553,10 +1553,10 @@ classes from System.IO.Packaging.
If you made changes to your control and want to re-install the package, an error message appear:
-

In order to provide an update, you need to increment version number in the VSIX manifest:
-

You can also increment version number in the Package class attribute, but this is not necessary for the VSIX to perform update:
@@ -1577,7 +1577,7 @@ Guids.cs: GuidList.guidSampleVsixPackagePkgString): (Tools - Extension Manager...). In Visual Studio 2012/2013, the corresponding dialog is called Extensions and Updates (Tools - Extensions and Updates...). -+
Quiet Mode
Both installation and uninstallation can be performed in quiet mode by using /quiet parameter. This will suppress user interface of the installer, which is handy when you want to automate @@ -1619,7 +1619,7 @@ under "bin\Release" subfolders and batch files (.CMD extension) are provided where appropriate.
-Download sample source code (212 KB) +Download sample source code (212 KB)
You can find the following folders in the archive:
@@ -1648,7 +1648,7 @@ provided.
-Download sample source code (212 KB) +Download sample source code (212 KB)
This work is licensed under a Creative Commons Attribution 3.0 Unported License.Component Owl WinForms - .NET 2.0 @@ -1660,7 +1660,7 @@ provided.@@ -1670,7 +1670,7 @@ provided.@@ -1773,7 +1773,7 @@ provided.Better ListView
@@ -1685,8 +1685,8 @@ provided.@@ -1699,31 +1699,31 @@ provided.-- +Latest From Our Blog
+Latest From Our Blog
-Activation issues and how to solve them
+Activation issues and how to solve them
Wednesday, 01 March 2017-The Three Main Advantages Better ListView has Over the Classic .NET Framework
+The Three Main Advantages Better ListView has Over the Classic .NET Framework
Thursday, 09 February 2017-BLV and Internet Explorer
+BLV and Internet Explorer
Sunday, 13 November 2016-Centering Images in Better ListView Sub-items
+Centering Images in Better ListView Sub-items
Wednesday, 06 August 2014-Sub-item Check Boxes in Better ListView
+Sub-item Check Boxes in Better ListView
Sunday, 06 July 2014@@ -1760,7 +1760,7 @@ provided.@@ -1734,7 +1734,7 @@ provided.@@ -1747,7 +1747,7 @@ provided.Better ListView Express 3.15 released!
Better ListView 3.15 released!
Better SplitButton 3.15 released!
Better Thumbnail Browser 3.15 released!
- Download latest release + Download latest release
@@ -1786,10 +1786,10 @@ provided.Better ListView Express 3.14.0 released!
- See what's new + See what's new or - Download latest release + Download latest release
@@ -1801,15 +1801,15 @@ provided.- + + + + +
--Copyright © 2018 ComponentOwl.com, Dextronet.com. All rights reserved. Read our EULA, Disclaimer and Privacy Policy.++Copyright © 2018 ComponentOwl.com, Dextronet.com. All rights reserved. Read our EULA, Disclaimer and Privacy Policy.diff --git a/src/data/better-listview/class-reference.html b/src/data/better-listview/class-reference.html index 48e0710..b81f8b7 100644 --- a/src/data/better-listview/class-reference.html +++ b/src/data/better-listview/class-reference.html @@ -12,8 +12,8 @@
- + « Introduction, Comparison -Index -Background Image » + Index +Background Image » Quick Start
Table of Contents
@@ -62,7 +62,7 @@ Toolbox window (View - Toolbox): -+
The Toolbox should contain a new tab called "ComponentOwl" containing all the installed component @@ -79,7 +79,7 @@
Right-click on empty area of the Toolbox window and select "Choose Items...":
-+
In the "Choose Toolbox Items" dialog, select the ".NET Framework Components" tab. If the comonent @@ -87,13 +87,13 @@ it, make sure the newest version is checked (e.g. 2.5.2.0 instead of 1.0.0.0) and click "OK":
-+
If you need other than installed version (e.g. DLL to match for specific .NET Framework version) click on the "Browse..." button:
-+
Browse for the betterlistview.dll file containing the component.
@@ -114,26 +114,26 @@ specific .NET version, choose the file from ".NET Framework Specific" folder: -+
Make sure the check box next to "BetterListView" is checked and click "OK":
-+
Now the component should appear in your Toolbox:
-+
Select the component and place it on designer surface:
-+
Now you can design Better ListView the same way as any other control:
-+
@@ -273,30 +273,30 @@ Dim hitTestInfo As BetterListViewHitTestInfo = listView.HitTest(New Point(0, 0))
We will happily answer any of your questions and provide further assistance. Just email us at support@componentowl.com. - Or, you can use the online form at www.componentowl.com/support.
+ Or, you can use the online form at www.componentowl.com/support.
- + « Introduction, Comparison -Index -Background Image » + Index +Background Image »
Better ListView Express Documentation - Copyright © ComponentOwl.com + Copyright © ComponentOwl.com