Files
2026-03-23 16:10:59 +00:00

433 lines
25 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta name="keywords" content="Better ListView story, Better ListView history, Better ListView background" />
<meta name="description" content="Learn about the history of the Better ListView control, and the reasons for its development." />
<meta name="author" content="Dextronet" />
<meta http-equiv="Title" content="The story behind Better ListView control" />
<meta name="copyright" content="(c) 2010-2018 Dextronet" />
<meta name="distribution" content="Global" />
<meta name="rating" content="General" />
<meta name="robots" content="All" />
<meta http-equiv="Content-Language" content="en" />
<meta name="verify-v1" content="NK0H1gWia1vxGZ2Yhr59gsS0/P2/USBI1DVA18VkzjM=" />
<meta name="google-site-verification" content="O7Dwtzu5x_Mob9u98uxqpZ-_wCLGpEkx2IL0UYVQ4ac" />
<title>The story behind Better ListView control</title>
<link rel="alternate" type="application/rss+xml" title="Component Owl Feed: Latest releases, news and tips &amp; tricks from our blog" href="../feeds.rss" />
<link rel="alternate" type="application/rss+xml" title="Component Owl's Comics: Latest comic strips for developers by Libor Tinka" href="../comics.rss" />
<link href="../stylesheets/base_packaged.css%3F1455269822.css" media="screen" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="d-page">
<script type="text/javascript">
//<![CDATA[
var t = {"antispam":"capek-rulz","purchase_email":"valid purchase email","valid_email":"a valid email","thanks_for_why_uninstall":"Thank you very much for your feedback!","thank_you":"Thank you!","current_email":"valid current email","thanks_for_subscription":"<div class=\"sent-saved-notice\">Thank You for your subscription!<br /><button type=\"button\" onclick=\"close_fancybox();\">Close</button>","message":"message","required":"required","download_in_progress":"Your download should be in progress...","your_full_name":"your full name","order_thanks_for_message":"<div class=\"sent-saved-notice\">Thank you very much for your message!<br /><button type=\"button\" onclick=\"close_fancybox();\">Close</button>","thanks_for_message":"Thank you very much for your message!<br /><a href="http://www.componentowl.com/better-listview/\&quot;#\"" onclick=\"send_another(); return false;\">Send Another Message</a>"}
//]]>
</script>
<div class="d-header d-placing">
<ul class="d-menu">
<li class=""><a href="../index.html" class="menu-item">Home</a></li>
<li class="active with-dropdown">
<a href="../better-listview.html" class="menu-item">Products</a>
<div class="dropdown dropdown-submenu" style="display: none; width: 370px"><div class="outer"><div class="shadowbox"><div class="border"><div class="inner">
<div class="dropdown-category">WinForms Components</div>
<a href="../better-listview.html" class="featured-item"><img alt="icon" src="http://assets.componentowl.com/icons/better-listview-32-1355160256.png?1355135056" /> Better ListView<br /><span class="subline">Ultimate ListView control for .NET</span></a>
<a href="../better-thumbnail-browser.html" class="featured-item"><img alt="icon" src="http://assets.componentowl.com/icons/better-thumbnail-browser-32-1355160281.png?1355135081" /> Better Thumbnail Browser<br /><span class="subline">Thumbnail loading and browsing control for .NET</span></a>
<a href="../better-splitbutton.html"><img alt="icon" src="http://assets.componentowl.com/icons/better-splitbutton-32-1355160307.png?1355135107" /> Better SplitButton<br /><span class="subline">Free customizable dropdown button control</span></a>
<a href="../better-listview-express.html"><img alt="icon" src="http://assets.componentowl.com/icons/better-listview-express-32-1355160327.png?1355135127" /> Better ListView Express<br /><span class="subline">Free edition with less features</span></a>
</div></div></div></div></div>
</li>
<li class="">
<a href="../pricing-licensing/better-listview.html" class="menu-item">Purchase</a>
<div class="dropdown dropdown-submenu" style="display: none; width: 330px"><div class="outer"><div class="shadowbox"><div class="border"><div class="inner">
<a href="../pricing-licensing/better-listview.html" class="featured-item">Better ListView</a>
<a href="../pricing-licensing/better-thumbnail-browser.html" class="featured-item">Better Thumbnail Browser</a>
<a href="../pricing-licensing/better-splitbutton.html">Better SplitButton</a>
</div></div></div></div></div>
</li>
<li class=""><a href="../support.html" class="menu-item">Support</a></li>
<li class=""><a href="../articles.html" class="menu-item">Articles</a></li>
<li class=""><a href="../blog.html" class="menu-item">Blog</a></li>
<li class=""><a href="../comics/43.html" class="menu-item">Comics</a></li>
<li class=""><a href="../about-us.html" class="menu-item">About Us</a></li>
</ul>
<div class="d-logo">
<a href="../index.html" class="logoimg"><img alt="Component Owl" src="../images/componentowl.gif%3F1455269978" /></a>
<g:plusone size="medium" count="false" href="http://www.componentowl.com"></g:plusone>
</div>
</div>
<div class="d-placing">
<div class="d-content-wrap">
<div class="subpage product-content">
<h1>Better ListView: Alternative list view control for .NET</h1>
<p class="section-info">Ideal .NET WinForms (C#, VB.net) replacement list view component. More features, less limitations, fast and optimized.</p>
<div class="sides">
<div class="right">
<input id="tabs-initial-index" name="tabs-initial-index" type="hidden" value="-1" />
<ul id="nav" class="nav">
<li><a href="../better-listview.html" class="">Overview</a></li>
<li><a href="screenshots.html" class="">Screenshots</a></li>
<li><a href="comparison-table.html" class="">Comparison</a></li>
<li><a href="resources.html" class="">Resources</a></li>
<li><a href="story.html" class="current">Story</a></li>
</ul>
<div id="nav-panel" class="nav-panel product-detail"><h2>The story behind Better Listview</h2>
<p>Hi, my name is Jiri Novotny and I'm the founder of <a href="http://www.dextronet.com" target="_blank">Dextronet.com</a>, a software company that operates ComponentOwl.com. Me and my team think of ourselves as independent software vendors (or ISVs).</p>
<p>Surprise surprise - as it is with most independent components today, we did not originally actually intended to create Better ListView.</p>
<p>Our flagship product is <a href="http://www.dextronet.com/swift-to-do-list-software" target="_blank">Swift To-Do List</a>, a desktop task management software. The old version of Swift To-Do List has been written in Visual Basic 6 which has many limitations, so we've decided to make a total rewrite in VB.NET and C#. The development started in July 2009.</p>
<p>Because Swift To-Do List is highly list-centric product (as the name suggests :-), it soon become apparent that we will need excellent ListView control. The ListView control included in .NET just didn't cut it. Not only its features are very limited, but there are braincracking bugs and strange behavior in lots of cases. In fact, the default .NET ListView was so bad, that I've oftentimes wished I could just use the ListView included in VB6 it has at least behaved mostly correctly.</p>
<p>So, because we couldn't use the default .NET ListView, I began searching for a replacement ListView control. My requirements were actually not very demanding - I wanted a ListView control that looked and behaved similarly as the one used in Windows Explorer. </p>
<p>Unfortunately, I've soon discovered that in reality, I want lots of things that are not taken for granted in any ListView control that I've found. My requirements for a usable .NET ListView control are:</p>
<ul class="common">
<li>It must either inherit from native ListView or mimick it perfectly</li>
<li>It must use system theme seamlessly and not have some weird inconsistent custom look</li>
<li>It must support sub-item images flawlessly</li>
<li>It must have excellent drag &amp; drop support for item reordering</li>
<li>It must have perfect implementation of selection and drag-selection</li>
<li>It must support 3 different context menus: For items, column headers, and empty space</li>
<li>Multi-column sort</li>
<li>Must not be part of some huge control pack that I need to bundle with my app</li>
<li>Must be light-weight, fast and optimized</li>
<li>Must have all bugs and strange behavior of .NET ListView fixed</li>
</ul>
<p>There was also lot of nice-to-have things that I've looked for, like:</p>
<ul class="common">
<li>Watermark text that is shown when the ListView is empty</li>
<li>Column reordering with auto-scrolling</li>
<li>100% managed code</li>
<li>Better hit-test</li>
</ul>
<p>I did not want to use any DataGrid-based control, as it can't really replace ListView control it is much harder to manipulate for the user in most cases, and it doesn't support many things that ListView does. </p>
<p>Swift To-Do List is a mass-market product, so it needed a ListView control that behaved as expected in all cases, no exceptions. The ListView control used in Windows Explorer is a great model: Because every user knows how to work with Windows Explorer ListView already, you can leverage that knowledge in your own applications. Your applications will be truly easy to use and learn.</p>
<p>I've looked over dozen of ListView controls and I'm not afraid to name them, because they just don't meet the above criteria. The controls I looked over included ListView from SoftGroup, three different open source ListView controls from CodeProject, ListView from Lidor systems, Grid and TreeView-Grid hybrid from DevExpres, WinListView from Infragistics, I've also looked at all ListView controls to be found at CodeGuru and more basically everything that I could Google and everything from all well-known (or not so well known) component providers.</p>
<p>I was disappointed with every single of these controls. Not one of them met my criteria.</p>
<p>Believe me, I <em>wanted</em> to find the perfect ListView control after all, I desperately needed it so we could use it in our own product. But what I've found during my extensive research? Nothing. Null. Nilch. Nada. Zero. My heart was broken. The dreams of our awesome <a href="http://www.dextronet.com/swift-to-do-list-software" target="_blank">Swift To-Do List 7</a> product started to shatter, because we needed an adequate ListView control first. When it comes to user experience, we simply couldn't settle for anything less than great.</p>
<p>But we haven't given up. The solution? To create our own ListView control. A Better ListView control. It was not originally intended to be a product on it's own, but when it has been finished, it was so good that it would be a sin to keep it selfishly just for ourselves. So we've started selling it. :-)</p>
<p>When we started building our own better ListView control, we wanted it to inherit from System.Windows.Forms.ListView at first. We've tried our best, but some of the bugs of .NET ListView were simply impossible to fix, even with ridiculous hacks. However, luck has shined upon us. </p>
<p>We've met Libor Tinka, a genius C# developer with extensive experience with not just programming in general, but specifically Windows control development as well. He's the author and sole developer of ImagingShop, a powerful digital photography processing desktop application that includes many of his custom controls, and lot's of hardcore mathematics and unique algorithms (It has over 220k lines of code in total!). That guy <strong>really</strong> is a genius and let me tell you, the code he writes is just beautiful. He's an artist.</p>
<p>When we've asked Libor to create a better ListView control for us, he accepted the challenge. </p>
<p>(By the way, it might look easy at first, but implementing your own ListView control is extremely difficult, daunting and complicated task there are so many corner cases in the control's behavior that it will make your brain want run away.)</p>
<p>We've worked very closely with Libor during the intensive development process. Fast forward 12 months into the future - Better ListView is done, and Libor is an integral part of our team. We still work together as we support and constantly enhance Better Listview.</p>
<p>Better ListView is now used not just in Swift To-Do List, but also in Libor's own product <a href="http://www.imagingshop.com">ImagingShop</a>, so we are truly eating our own dog food. This is your <strong>guarantee</strong> that we will <strong>not</strong> stop supporting Better ListView, fixing bugs and implementing new features it's the <strong>core</strong> and <strong>heart</strong> of our own desktop software products after all. We walk the talk.</p>
<p>If Better ListView existed before, I know I would be absolutely positively <strong>thrilled</strong> about it. And so I hope that you are thrilled about it now that you've found it.</p>
<p>Any questions or comments? I would love to get them. Contact me at <span class="emil">novotny (at) dextronet (dot) com</span></div>
</div>
<div class="left">
<div class="buttons-box">
<a href="../betterlistview.exe" class="standard-download image-link" onclick="download_email('better-listview');">Download Free Trial - With sample projects</a>
<a href="../pricing-licensing/better-listview.html" class="standard-buy image-link">See Pricing &amp; Licensing</a>
<p>Version 3.15 / May 27, 2015</p>
</div>
<div class="compatibility">
<p><strong>Seamless integration with .NET 2.0 and higher</strong></p>
<div class="documentation">
<p><a href="quick-start-guide.html" onclick="window.open(this.href); return false">See Quick Start Guide</a></p>
<p><a href="documentation.html" onclick="window.open(this.href); return false">See Documentation</a></p>
<p><a href="class-reference.html" onclick="window.open(this.href); return false">See Class Reference</a></p>
</div>
</div>
<div class="screenshot">
<p><a href="http://assets.componentowl.com/screenshots/15/blv-overview_original_1326499754.png?1326474554" class="screenshot" title="Better ListView control"><img alt="Better ListView" src="http://assets.componentowl.com/screenshots/15/blv-overview_thumb_1326499754.png?1326474554" /></a></p>
</div>
<div class="newsletter">
<form action="http://www.componentowl.com/subscriptions" class="new_subscription" id="new_subscription_product" method="post" onsubmit="if (!validate_newsletter_form(this)) return false; jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()) + '&amp;authenticity_token=' + encodeURIComponent('dJeFtbWrARc0arEomU+SG+XtypwJr2F4Kc9v14woStM='), dataType:'script', type:'post', url:'/subscriptions'}); return false;"><div style="margin:0;padding:0;display:inline"><input name="authenticity_token" type="hidden" value="dJeFtbWrARc0arEomU+SG+XtypwJr2F4Kc9v14woStM=" /></div> <input id="subscription_subscription_location_id" name="subscription[subscription_location_id]" type="hidden" value="512994065" />
<input id="form_id" name="form_id" type="hidden" value="#new_subscription_product" />
<strong>Receive product updates<br />and news via email:</strong>
<div><input class="email inline-label" id="product-newsletter-email" name="subscription[email]" size="30" type="text" value="Your Email" /></div>
<div id="product-newsleter-lists" class="subscription-lists-ct" style="display: none"><input name="subscription[subscription_list_ids][]" type="hidden" value="970100327" />
<input name="subscription[subscription_list_ids][]" type="hidden" value="1009842129" /></div>
<span class="dbtn-c subscribe dbtn-small" id="send"><span class="dbtn-w"><input class="dbtn" name="commit" type="submit" value="Subscribe" /></span></span>
</form></div>
<div class="sharethis-ct">
<strong>Share this page if you like it:</strong>
<div class="sharethis">
<script type="text/javascript" src="http://w.sharethis.com/button/sharethis.js#publisher=db6a9d0e-5d07-4036-8bed-4959941491f3&amp;type=website&amp;post_services=email%2Cfacebook%2Ctwitter%2Cgbuzz%2Cmyspace%2Cdigg%2Csms%2Cwindows_live%2Cdelicious%2Cstumbleupon%2Creddit%2Cgoogle_bmarks%2Clinkedin%2Cbebo%2Cybuzz%2Cblogger%2Cyahoo_bmarks%2Cmixx%2Ctechnorati%2Cfriendfeed%2Cpropeller%2Cwordpress%2Cnewsvine"></script>
</div>
</div>
<div class="screenshot">
<p><a href="http://assets.componentowl.com/screenshots/16/thumbnails_original_1312133021.png?1312107821" class="screenshot" title="Image thumbnails in groups"><img alt="Thumbnails" src="http://assets.componentowl.com/screenshots/16/thumbnails_thumb_1312133021.png?1312107821" /></a></p>
</div>
<div class="screenshot">
<p><a href="http://assets.componentowl.com/screenshots/21/multi-line-items_original_1312133213.png?1312108013" class="screenshot" title="Items with multi-line text"><img alt="Multi-line Items" src="http://assets.componentowl.com/screenshots/21/multi-line-items_thumb_1312133213.png?1312108013" /></a></p>
</div>
<div class="screenshot">
<p><a href="http://assets.componentowl.com/screenshots/18/betterlistview-tree-hierarchy_original_1313676477.png?1313651277" class="screenshot" title="Items organized in a tree-like hierarchy"><img alt="Item Hierarchy" src="http://assets.componentowl.com/screenshots/18/betterlistview-tree-hierarchy_thumb_1313676477.png?1313651277" /></a></p>
</div>
<div class="small-button-ct">
<a href="screenshots.html" class="small-button"><span>More Screenshots</span></a>
</div>
</div>
</div>
<div class="buttons-wrap">
<div class="buttons">
<a href="../betterlistview.exe" class="standard-download image-link" onclick="download_email('better-listview');">Download Free Trial - With sample projects</a>
<a href="../pricing-licensing/better-listview.html" class="standard-buy image-link">See Pricing &amp; Licensing</a>
</div>
</div>
</div>
<div id="screenshot-buttons" style="display: none">
<div class="buttons">
<a href="../betterlistview.exe" class="small-download image-link" onclick="download_email('better-listview');">Free Download</a>
<a href="../pricing-licensing/better-listview.html" class="small-buy image-link">See Pricing &amp; Licensing</a>
</div>
</div>
</div>
</div>
<div class="d-footer">
<div class="d-placing">
<div class="left">
<div class="latest-posts">
<h3 class="latest_from_blog"><a href="../blog.html">Latest From Our Blog</a></h3>
<h4><a href="../blog/index.html%3Fp=927.html">Activation issues and how to solve them</a></h4>
<div class="post-info">Wednesday, 01 March 2017</div>
<h4><a href="../blog/index.html%3Fp=921.html">The Three Main Advantages Better ListView has Over the Classic .NET Framework</a></h4>
<div class="post-info">Thursday, 09 February 2017</div>
<h4><a href="../blog/index.html%3Fp=914.html">BLV and Internet Explorer</a></h4>
<div class="post-info">Sunday, 13 November 2016</div>
<h4><a href="../blog/index.html%3Fp=906.html">Centering Images in Better ListView Sub-items</a></h4>
<div class="post-info">Wednesday, 06 August 2014</div>
<h4><a href="../blog/index.html%3Fp=901.html">Sub-item Check Boxes in Better ListView</a></h4>
<div class="post-info">Sunday, 06 July 2014</div>
</div>
<div class="other-posts"><a href="../blog.html">See more posts &raquo;</a></div>
</div>
<div class="right">
<div class="news">
<ul class="links">
<li><a href="../feeds.rss" class="rss">Subscribe to our RSS</a></li>
<li><a href="http://twitter.com/ComponentOwl" class="twitter">Follow us on twitter</a></li>
</ul>
<div class="news-item ">
<div class="date">27<span>May</span></div>
<div class="message">
<h4>Better ListView Express 3.15 released!</h4>
<p>
<a href="../betterlistviewexpress.exe" onclick="download_email('better-listview-express');">Download latest release</a>
</p>
</div>
</div>
<div class="news-item ">
<div class="date">27<span>May</span></div>
<div class="message">
<h4>Better ListView 3.15 released!</h4>
<p>
<a href="../betterlistview.exe" onclick="download_email('better-listview');">Download latest release</a>
</p>
</div>
</div>
<div class="news-item ">
<div class="date">27<span>May</span></div>
<div class="message">
<h4>Better SplitButton 3.15 released!</h4>
<p>
<a href="../bettersplitbutton.exe" onclick="download_email('better-splitbutton');">Download latest release</a>
</p>
</div>
</div>
<div class="news-item ">
<div class="date">27<span>May</span></div>
<div class="message">
<h4>Better Thumbnail Browser 3.15 released!</h4>
<p>
<a href="../betterthumbnailbrowser.exe" onclick="download_email('better-thumbnail-browser');">Download latest release</a>
</p>
</div>
</div>
<div class="news-item last-item">
<div class="date">08<span>Apr</span></div>
<div class="message">
<h4>Better ListView Express 3.14.0 released!</h4>
<p>
<a href="../better-listview-express/releases%3Fsince=3.14.0.html">See what's new</a>
or
<a href="../betterlistviewexpress.exe" onclick="download_email('better-listview-express');">Download latest release</a>
</p>
</div>
</div>
</div>
</div>
</div>
<div class="d-placing">
<hr />
<div class="copy"><div class="social"><a href="../support.html" class="feedback">Contact Us (Feedback)</a> <span>|</span> <a href="../feeds.rss" class="rss">RSS</a> <span>|</span> <a href="http://twitter.com/ComponentOwl" class="twitter">Twitter</a> <span>|</span> <a href="../sitemap.html" class="sitemap">Sitemap</a> <span>|</span> Our <a href="../index.html" class="stdl">task management software</a> that uses Better ListView</div>
Copyright &copy; 2018 ComponentOwl.com, Dextronet.com. All rights reserved. Read our <a href="../eula.html">EULA</a>, <a href="../disclaimer.html">Disclaimer</a> and <a href="../privacy-policy.html">Privacy Policy</a>.<br /></div>
</div>
</div>
</div>
<script src="../javascripts/app_packaged.js%3F1455269826" type="text/javascript"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-16362539-4']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<script src="http://load.sumome.com/" data-sumo-site-id="854b5e00f297990012cc230023375a00787c0000216621002775a800d79ad500" async="async"></script>
<!-- Place this tag after the last plusone tag -->
<script type="text/javascript">
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
</script>
</body>
</html>