Blogs

News

Favorite Posts

ctodx

Discussions, news and rants from the CTO of Developer Express, Julian M Bucknall

March 2009 - Posts

  • Twitter, DevExpress, and you

         

    TwitterBirdThere was an interesting article in the Financial Times this morning: "Small businesses find big value in Twitter" (reg. req.). The article is about how small tech companies in the UK are embracing Twitter as a medium to communicate with their customers, to monitor what's being said about them online, to track their competitors, but that larger companies are slower to jump on the bandwagon. Comparisons were made to the US, where the use of Twitter is more prevalent.

    How did I find out about it? A friend twittered me the URL.

    For those of you who are already on Twitter, you know that many of us at DevExpress are twittering already. Furthermore we have a company account which we use for company announcements and for re-twittering other tweets we find interesting. Our evangelists are monitoring keywords that deal with DevExpress so that we can immediately respond to issues being twittered by customers in (almost) real-time. We certainly feel that Twitter is a valuable addition to our marketing tools to reach out to possible and existing customers.

    Here are the account names for us and our evangelists for you to follow to learn about DevExpress stuff and happenings as it happens. Scary, but sometimes you have to grasp the nettle Smile

    @DevExpress   

    @MehulHarry    @GaryShort    @JMBucknall    @RoryBecker   

    @RachelHawley    @DXLight    @PKimmel    @MillerMark   

    If you are not on Twitter yet, why don't you create an account and have a look at what it can do for you. Scott Hanselman had a real good post about how to use Twitter (and what all the jargon means) just recently.

    So, please follow us and join in on the conversation!

  • Great post on CodeRush/Refactor! Pro v2009.1

         

    Did we suddenly employ Rory Becker and no one told me? He's done a great write-up on his blog about CodeRush and Refactor! Pro v2009.1, beating out our own.

    So, head on over there and read all about the new features in our IDE productivity tools while we scramble to write our own post. In fact, I would make a point of visiting it once a day — Rory keeps on updating it with new stuff as he finds it.

  • Whither (or should that be wither?) WPF?

         

    Scott Guthrie's big keynote of MIX09 has just ended and we're left with the aftershocks of some pretty exciting news. The Silverlight 3 beta was released (along with the SDK, and other goodies) and Scott took us on a whirlwind tour of what's new and what's coming up with it.

    Old and new mice The shocker to me was the GPU hardware accelerated support for Silverlight 3. In the browser! I'll let you ruminate on that a little while to let it sink in. Furthermore there's 3D support as well, and Silverlight exposes all this to the media features to enable better, higher definition, video. That may have been the impetus for it, but it's also very much available for lowly business apps too. To prove it Scott showed off some of the 3D effects on a normal datagrid app. (Live update from MIX09: ah, not quite 3D but essentially perspective transformations; Perspective 3D, if I got the term right.)

    And then another shocker: Silverlight running outside the browser as a desktop app, either on Windows or the Mac. Absolutely fascinating in my book, given our own experiments in that area. Some nice demos of Silverlight in Blend were shown off as well.

    So what do we have? Silverlight 3 reaching outside the sandbox to use hardware graphics acceleration and 3D for video, and Silverlight 3 running as a desktop app. Oh, and, it's cross-platform.

    But... What's WPF used for again? What's the value proposition for WPF? Why should anyone even begin a new WPF business app now, when they can spend the time creating the same app in Silverlight, running in the browser and on the desktop (several desktops)? The only thing I can come up with at the moment is that WPF has a richer run-time. And, um, well, that's it. Someone is whispering over IM that it has a better data access story as well, but I can't imagine that's going to be a differentiator for very long. (Live update from MIX09: seems there's a new Data Access layer for Silverlight 3 based on Entity Framework, so I was frighteningly right.)

    Look, it seems clear to me that Silverlight is getting all the love (branding, promotion, what have you) from Microsoft at the moment for one very good reason: Adobe. Which browser media/RIA add-in is almost ubiquitous these days? Adobe Flash. What are Microsoft concentrating a lot of effort on? Silverlight, the competitor to Flash. Hmm.

    Want to write an RIA? There's a plethora of different ways to do it, but the one I see most often these days is Adobe Flex and, er, Flash again. But, man, you have to learn ActionScript. Oh, and here's Silverlight using C# and VB. No competition. Want some controls? The Silverlight Control Toolkit on Codeplex will do you fine (100+ controls!, says Scott) and you can always pay vendors like ourselves to get controls with richer, deeper functionality.

    All of this is to mass web developers against the current norm for media over the 'net and RIAs. Nothing against it, mind: out of such competition we all get better software and features. But let's not kid ourselves, Silverlight is in a fight against Flash for the mindshare of media/RIA developers, but I'm seeing WPF as collateral damage.

    And I look at our roadmaps for this year and I wonder.

  • So what do you think of DXperience v2009.1?

         

    The beta's out for our DXperience Enterprise and Universal customers, with all of its new features (some of which we've been talking about here) and new install (CodeRush and Refactor! Pro are now in the main install. W00t!). So, now that you've had it for a few days,  what do you think of it?

    Cat uses a laptopTell you what. I went out and bought one of the new iPod Shuffles on Monday at my local Apple store, and I'm not particularly enamored with it (I'm not a fan of the Apple earbuds — my ears are a funny shape and they fall out — er, the earbuds, that is, not my ears — and of course the Shuffle is controlled through the earbud cord), so let my loss be your gain. Blog or Twitter or Facebook or post to whatever social network is your scene about your thoughts on DXperience v2009.1, send me the link (remember: it's julianb@devexpress.com), and I'll send the author of the best post this brand new iPod Shuffle. I just hope they don't have ears like mine.

    By "best" of course, I mean to be entirely subjective -- Bwhahaha! -- but if I find there's more of you that qualify under that moniker, I'll use my company Amex and buy a couple more.

    So get writing, get snapping those screenshots, get screencasting, get your cat to show us how easy it is to refactor code, whatever. Have some fun, show us what you like and maybe win an iPod Shuffle.

  • Three years, 36 months, or 156 weeks later

         

    This Sunday, a three year anniversary came and went, and because I was writing an article for a magazine I forgot all about it. Three years ago, on March 15, 2006, I officially started work at DevExpress as CTO, trying to fill the nine-league boots left by Richard Morris, my predecessor.

    It's instructive to think about what has happened over the past three years of DevExpress' life while I had my hand on the technology tiller.

    - We started these blogs and this community site very soon after I joined (this blog was started on April 7, 2006). One of my remits was to blog about what we were doing, what we wanted to do, what we had done and shouldn't have, and the rest of it. And to be candid and open. This post makes it blog number 290 for me, a smidgeon less than 100 posts a year, or a post every 2.5 business days. In the early days I was pretty much the only blogger, but now we have Oliver, Gary, Mehul, and Emil writing like crazy too. Community Server tells me I've had 1716 comments published to these blog posts, which probably means my Mum has been typing non-stop.

    - The community section here was the first step to opening up DevExpress more so that our customers can see what we're about. When I started there was a lot of resistance to this (keeping the window blinds drawn means that people can't see our mistakes), but I'd have to say we've been quite successful at it. We now have roadmaps every year, we pre-announce new features with screenshots, I sometimes predict (and get disastrously wrong) when we'll release, we're better at support and at documentation than we were, etc. I get the feeling that customers are more confident about what we're doing and therefore keener to renew subscriptions and so on. I'm not saying we're perfect yet — we still make mistakes — but we've come light years from where we were.

    - When I started there were just the WinForms, ASP.NET and VCL products. We'd just begun the subscription licensing plan (and the whole client center application was in the process of being written with an early alpha of XAF in order to accommodate it). Since then we have had three new technologies to research and decide about: WPF, Silverlight, and ASP.NET MVC. Despite the growth in the company (headcount has increased by about 2/3 in this time), this still represents a dilution of our efforts in any one platform.

    - The number of customers we have has grown too (thankfully!), and we have very good retention rates for our subscription customers. I can't claim any kudos for this because I think the company as a whole has become much more customer-centric (although if you ever listen in on one of our marketing/evangelism meetings, you'll hear Ray berating us for not being customer-centric enough) and I feel that you, our customers, are supportive of what we are trying to do and what we produce. We do listen to you about our products and what we need to improve them, even though those improvements may not happen as quickly as you'd like. Another big aspect of being customer-centric is that you can contact any of us at a moment's notice: my email address is julianb@devexpress.com, for example. If you want to phone: 818 844 3383, extension 206.

    - Another one of my remits was to drive the quality of our products upwards. About 6 months after I joined, we were at TechEd Europe in Barcelona, and I remember having this long meeting in the hotel bar with the main R&D leads (they were there too) to discuss and thrash out how we were going to implement agile practices, including TDD and unit tests. Since then we've even released our unit test suite as part of DXperience, and ASPxGridView (as far as I recall) was the first product we wrote using pair-programming. The couple of ***-ups we've had since then with our releases (there was the black day when we posted two different releases with the same version number, for example) has only driven us as a company to improve quality. As with everything, it's a journey: we're not there yet, nor do I expect us to reach it.

    - Almost a year ago, we leased some office space in Glendale, CA, and moved in. Pretty quickly, this became our marketing hub and I started to rack up the miles on Southwest travelling back and forth. During this time we started the DevExpress Channel and Jeff and Amanda and Erica came on board. Our magazine and web advertising is now done exclusively in Glendale and we've had some spectacular campaigns over the past year, due to the work Kevin and AJ have put into them (AJ's the graphics wizard behind our conference giveaways as well). A side-result of all this marketing is that I'm now the go-to person for magazine editors and reporters on how DevExpress is reacting to the news du jour, which of course only increases the penetration of our company brand.

    All in all, three years filled with incident and color. I certainly didn't think it would be like this, to be honest.

    Anyway, if you're an old-timer customer-wise and remember the days BJ (Before Julian), or are a relatively new customer and are wondering what all this fuss is about, I'd like to welcome you on board the DevExpress roller-coaster, it's been a wild ride so far but you ain't seen nothing yet. Fasten your seatbelts.

  • When does it become change for the sake of change?

         

    So I got an email from R&D the other day:

    The guys are asking if they should go through property lists and rename properties with bad grammar:

    • IsNeedFocus
    • IsImageExist
    • etc

    These won’t be breaking changes – they’ll create new properly-named properties and mark the old ones as obsolete.

    I'm not quite sure what prompted this particular project — developers can be quite ungrammatical at times and often these slips are never caught before a product is released and it's all set in stone. I replied:

    Well, in theory it's fine (that is, create new identifier, mark old one as obsolete), but let's take a look at the list of old names and new names that they have.

    And I got this nascent list this morning:

    • IsNeedFocus -> NeedsFocus
    • IsImageExist -> ImageExists
    • IsLargeImageExist -> LargeImageExists
    • IsExistAnyRowFooterCell -> ?
    • etc

    Now, I'll be the first to admit that the original names won't win any linguistic prizes; in fact, they make code jarring to read. (That last one must have been the result of a very long night.) For example, here's the first one of those instances being used in our code (and in fact it's the only time it's used):

    edit.Visible = true;
    if(checkForFocus) {
      if(edit.IsNeedFocus) edit.Focus();
    } else 
      edit.Focus();

    Here edit is an editor control. Now, to me, that nested if is very hard to read as it stands: "if edit is need focus then edit-focus". The suggested change would make it:

    edit.Visible = true;
    if(checkForFocus) {
      if(edit.NeedsFocus) edit.Focus();
    } else 
      edit.Focus();

    Which I'm sure you will agree is much more readable: "if edit needs focus then edit-focus".

    Now, the thing is, I'm undecided on how to proceed with this project. To me, this is a strong example of the "broken window" theory, that a small defect, left untended and unrepaired, leads users to believe that we don't care about our code so why should they; that if we can't even be bothered to fix a glaring easy-to-solve issue, albeit small, then the rest of our code becomes suspect.

    However, changing these names is not free. First of all, R&D has to determine which names are valid for change and which can be left alone. They have to write the new properties (and methods), and then mark the old ones as obsolete (the Refactor! Pro Safe Rename refactoring would come in handy here, obviously). They then have to recompile everything (demos and all) and fix all the warnings about obsolete usages. The tech writers have to come in on the act, and make sure the documentation is changed to reflect the new names (and that includes the embedded examples). The support team have to check the knowledgebase and so on. And that's just our costs. Your costs, we'll blithely ignore Smile, but of course these changes will have an effect on your code too and you'll have to make modifications and retest.

    So my question to you is, is this worthwhile? Does our laudable goal of improving our clumsy use of English (repairing the broken window) make sense? Do you care enough to have to change your code? What if we did it piecemeal, a product a release, say?

  • Another member of DXSquad

         

    Wow, we're going crazy inviting great members of our community to become part of DXSquad. The latest member to be invited is Chris Walsh, and, lawks, he accepted despite Brendon being there already.

    Please join me in welcoming Chris to the team.

  • Latest member of DXSquad

         

    I'm pleased to announce (before anyone else manages to) that Brendon Muck was swayed by the offer of a free t-shirt and miscellaneous other goodies (Ed: a new email address at hotmail.com) and agreed to join DXSquad. He'll be jumping into the forums with both feet and helping out — er, OK, he's already very visible there otherwise he wouldn't have been asked — with his freshly minted DXSquad badge in hand. Now you'll just have to listen to him.

    Please do join me in welcoming him to the team.

  • The DXHelmet as earbuds

         

    Sorry, couldn't let this one go by: Japan Makes iPhone Control in the Blink of an Eye or Other Facial Signal.

    I guess we weren't inventive enough:

    Mark and Julian at launch of DXhelmet

  • Licenses.licx file woes

         

    File this under ASP.NET, Department of WTF.

    Frustration When you are developing a web application with our controls, a mysterious file called licenses.licx appears. No, it's not an order to use a weirdly-named lollipop, but is a transitional file generated (and modified) by Visual Studio that participates in license checking. In design mode, Visual Studio uses this file to make a note of every licensed control you use in your design. When you then build your application, Visual Studio read this licenses.licx file and for every control mentioned there, will load the relevant assembly and run the license code in that assembly to see if the assembly is properly licensed (that is, that the product to which it belongs has been properly installed on that machine). If everything checks out, Visual Studio embeds the license key into the executable. If it doesn't, you'll get weird error messages about the control not being licensed (my favorite is "Could not transform licenses file 'licenses.licx' into a binary resource." to which I usually invoke the colorful language of my ancestors).

    Licenses.licx is actually a file in your solution (if you cannot see it there, click Show All Files). Visual Studio uses a program called lc.exe to compile the licenses into embedded resources in your application, and when things go wrong with the license compiling I've seen error messages that reference this executable as well.

    Here's an example of a line in a licenses.licx file.

    DevExpress.XtraCharts.Web.WebChartControl, DevExpress.XtraCharts.v8.2.Web, Version=8.2.4.0, Culture=neutral, PublicKeyToken=9b171c9fd64da1d1

    The first value in this comma delimited list is the class, the second is the assembly where it's found, and the other values are the rest of the assembly's strong name. I'm sure you can see problems already, especially when you upgrade a solution to the latest versions of the third-party controls you use. If you want, you can edit this file and remove the strong name parts with no problem.

    But that's not the biggest issue with licenses.licx. The thing is Visual Studio has a propensity of touching this file if you open the solution (that's "touching" as in changing the file date to the current date/time). This plays havoc with licensing, especially if you happen open the solution on a non-licensed machine and you are using source control. Suddenly your build machine will throw off these "cannot transform" messages and you're left wondering what went wrong. Another prevalent issue is when you have a team of developers working on a solution: they're all unconsciously "modifying" this file.

    So, the answer seems to be not to put the licenses.licx file under source control. (KB article)

    But this solution to the problem throws another red flag: if one of the developers in a team adds a new control that needs licensing to the form, a line gets added to his local licenses.licx file and it may not get reflected in source control. Bam, your build machine fails the build and Joe, who added the control, has to buy doughnuts for the team until someone else breaks the build.

    I'm afraid I have no good solution to this latter issue, because unfortunately the "not putting licenses.licx in source control" seems to be the way everyone is solving the licensing problem. Another solution is to delete the licenses.licx file altogether and then get Visual Studio to regenerate it by opening the solution (although this is a bit difficult on a build machine).

    Anyway, hope that all helps in some way. And hitting your laptop with a phone isn't really going to help.

  • Breaking Changes in DXperience v2009 vol 1

         

    As usual, whenever we make changes to our products in order to accommodate new features, add enhancements, or fix issues, there is the possibility that we introduce a breaking change. We try and minimize these as much as we are able, but sometimes we have no choice.

    These are the breaking changes that will be introduced in DXperience v2009.1:

    ASPxGridView

    SettingsCookies.StoreColumnsVisibilePosition has been renamed to SettingsCookies.StoreColumnsVisiblePosition

    • Typo fixed, visiBILE has been changed to visiBLE.

    ASPxperience

    The logic of rendering the ASPxDataView control to a page has been changed - it is now always rendered, even if it's empty

    • Previously, an empty ASPxDataView control that didn’t contain data items wasn't rendered into the page, and it couldn't be accessible on the client side via code. Now, the rendering logic of the ASPxDataView control has been changed and it is always rendered into the page, be it empty or not. For an empty ASPxDataView control a specific explanatory text or a custom template can now be rendered.

    Core Scheduler

    (Note: these changes apply to both ASPxScheduler and XtraScheduler)

    CollectionChangedAction enum has been moved from the DevExpress.XtraScheduler namespace to the DevExpress.Utils namespace

    CollectionChangedEventArgs<T> has been moved from the DevExpress.XtraScheduler.Native namespace to the DevExpress.Utils namespace

    CollectionChangedEventHandler<T> has been moved from the DevExpress.XtraScheduler.Native namespace to the DevExpress.Utils namespace

    CollectionChangingEventArgs<T> has been moved from the DevExpress.XtraScheduler.Native namespace to the DevExpress.Utils namespace

    CollectionChangingEventHandler<T> has been moved from the DevExpress.XtraScheduler.Native namespace to the DevExpress.Utils namespace

    DXCollection<T> has been moved from the DevExpress.XtraScheduler namespace to the DevExpress.Utils namespace

    DXCollectionBase<T> has been moved from the DevExpress.XtraScheduler namespace to the DevExpress.Utils namespace

    DXCollectionWithSetItem<T> has been moved from the DevExpress.XtraScheduler namespace to the DevExpress.Utils namespace

    NotificationCollection<T> has been moved from the DevExpress.XtraScheduler namespace to the DevExpress.Utils namespace

    DevExpress.XtraScheduler.CustomFieldCollection.Capacity property has been removed

    Several non-generic collection-related classes have been marked obsolete

    • The following non-generic classes are now obsolete: NotificationCollection, CollectionChangingEventHandler, CollectionChangingEventArgs, CollectionChangedEventHandler, CollectionChangedEventArgs.

    The DevExpress.XtraScheduler.CustomFieldCollection class no longer implements the IList interface

    • In general, this breaking change shouldn't have any effect on your applications, unless you have directly cast a CustomFieldCollection object to the IList interface.

    The DevExpress.XtraScheduler.CustomFieldCollection class no longer implements the ICollection interface

    • In general, this breaking change shouldn't have any effect on your applications, unless you have directly cast a CustomFieldCollection object to the ICollection interface.

    DXCharts for WPF

    DXCharts for WPF v2009 vol 1 is not compatible with v2008 vol 3 due to numerous API changes. For example:

    • The AreaSeries class has been renamed to the AreaSeries2D.
    • The LineSeries class has been renamed to the LineSeries2D.
    • The BarModelKind class has been renamed to the Bar2DModelKind.
    • The BarSeries class has been renamed to the BarSideBySideSeries2D.
    • The BarModelDescriptor class has been renamed to the Bar2DModelDescriptor.
    • The MarkerKind class has been renamed to the Marker2DKind.
    • The MarkerModelDescriptor class has been renamed to the Marker2DModelDescriptor.
    • The AxisLabelPosition enumeration has been renamed to the Axis3DLabelPosition.
    • The BarLabelPosition enumeration has been renamed to the Bar2DLabelPosition.
    • The SeriesXYUnwindingAction class has been renamed to the SeriesUnwindingAction.
    • The LineSeries2DBase class has been removed. Now, the LineSeries2D and AreaSeries2D classes are descendants of the PointSeries2DBase class.
    • The IMarker2D interface has been introduced. This interface allows you to access series marker properties.
    • The PieSeries2D and PieSeries3D classes have been derived from the base PieSeriesBase class.
    • The VisualContainer2D and VisualContainer3D classes have been united into a single VisualContainer class.
    • The BarModelDescriptor.BaseColor property has been removed.
    • Te BarSeries3D.BaseColor property has been removed.
    • The MarkerModelDescriptor.BaseColor property has been removed.
    • The SeriesLabel.BaseColor property has been removed.
    • The PieSeries3D.PercentOptions property has been removed. New PercentView class has been introduced to substitute for this property. For now, this class contains the attached PercentOptions property which can be set to the PointOptions object, if the series supports percentages (e.g. PieSeries3D, AreaFullStackedSeries2D etc.).
    • The type of PieSeries3D.HoleRadiusPercent property was changed. The PieSeries3D.HoleRadiusPercent has been moved to PieSeriesBase class, and type of HoleRadiusPercent property was changed from int to double.

    eXpressApp Framework (XAF)

    The CollectionSourceBase class has been refactored

    • The CollectionSourceBase.Collection property now raises an exception when the CollectionSourceBase instance is being initialized (that is, the IsInitialization property returns true). This allows us to prohibit access to the Collection until all Controllers are initialized.
    • So, it is now impossible to use the Collection property in a Controller's OnActivated method or Activated event handler. The CollectionSourceBase.CollectionChanged event should be used instead.

    The invisible ViewsNavigation Action Container has been removed from the Main Form's toolbar

    • Previously, the ShowNavigationItem Action was mapped to the following Action Containers:
      • NavBarActionContainer. It displayed the Action via a navbar.
      • ActionContainerBarItem. It didn't display the Action, but it was used to support keyboard shortcuts for the Action's items.
    • The ActionContainerBarItem Action Container now displays the Action as an item in the View menu of the Main Form Template. So, the Action is displayed by two controls in the main form: navbar and menu item.

    Several obsolete methods have been removed

    • The methods that were removed are: RuleSetValidationResult.GetOldValidationResults(Boolean returnOnlyInvalid) and RuleSetValidationResult.GetOldValidationResults()

    ActionContainer's events have been refactored

    • The ActionContainerBarItem.CreateCustomActionControl and DefaultBarActionItemsFactory.CreateCustomBarItemControl events, which were used for backward compatibility, have now been removed. In addition the non-generic CreateCustomActionControlEventArgs and CreateCustomActionControlArgs classes have been removed as well. In order to access the controls created for Actions, you should use the ActionContainerBarItem.CustomizeActionControl and DefaultBarActionItemsFactory.CreateCustomBarItemControl events. The latter event is static.
    • The BarActionItemsFactory.BarItemChanged event now has the arguments of the BarItemChangedEventArgs type.
    • The BarActionItemsFactory<ItemInfoType> class' CreateBarItem protected method has been renamed to "CreateActionItem".

    Setters for several properties have been removed

    • Setters for the following properties have been removed: RuleValidationResult.IsValid, RuleValidationResult.ErrorMessage, RuleSetValidationResultItem.Rule, RuleSetValidationResultItem.Target, RuleSetValidationResultItem.ErrorMessage

    Actions with the Unspecified category

    • The Default Action Container has been removed from the context menu that can be invoked for List Views. So, Actions with the Unspecified category are no longer displayed in the context menu. They are only visible in the toolbar

    The point in time when the ModuleBase.Setup method is called has been changed

    • Previously, the ModuleBase.Setup method was not called by the XafApplication.Setup method. Now, it's called just after a module is added to the XafApplication.Modules list.
    • Non-persistent properties are now excluded from the search performed by the "Filter by Text" Action
    • To add a non-persistent property to the set of the properties that are used by the "Filter by Text" Action's SearchCriteriaBuilder to generate a filter criterion, apply the SearchMemberOptions attribute with the SeachMemberMode.Include parameter value to this property.

    XtraCharts

    The PointOverlappingOptions.AttractToMarker and PointOverlappingOptions.IndentFromMarker obsolete properties have been removed

    •     Instead, use the OverlappingOptions.Mode and SeriesLabelBase.LineLength properties, respectively.

    The Side-by-side Bars behavior has been changed

    •     If two series of the Bar, the Side-by-side Range Bar, or the Side-by-side Gantt series view have the same X-axis and different Y-axes, they are now placed side-by-side (whereas in previous versions, they were overlapped).

    XtraGrid

    GridColumn.Caption is set to an empty string while populating columns

    • By default, when populating columns, the GridColumn.Caption property is set to an empty string. The actual column captions are generated automatically based on field names. However, you can provide custom column captions by assigning them to the GridColumn.Caption property.

    The default value of the CardView.CardCaptionFormat is now the empty string, and the actual value is retrieved from the resources

    • The CardView.CardCaptionFormat property has been made localizable.
    • Now the default value retrieved by this property is the empty string. The actual value is specified by the resources files.
    • You can still change the CardCaptionFormat property if you want to override the default value stored in the resource files.

    By default, now pressing the PAGE DOWN key focuses the bottom visible record

    • This change to the functionality improves the navigation and selection behavior when using the Page Down key. From now on, if the top record is focused, pressing Page Down moves focus to the bottom visible record. In multiple selection mode, pressing Shift + Page Down selects all the records between the top and the bottom visible records, and moves focus to the bottom record. This means an end-user will clearly see the current selection. In previous versions, the selection was scrolled out of view.
    • To revert to the old navigation mode, set the GridOptionsNavigation.UseOfficePageNavigation property to false.

    The type of the CacheValuesOnRowUpdating property has been changed

    • This version corrects a typo in the name of the CacheValuesOnRowUpdating property's type.

    When an end-user changes the summary type via context menus, the summary values are now formatted according to the column's DisplayFormat

    • A column's cells are formatted according to the GridColumn.DisplayFormat property. In v9.1, the summary values are also formatted using this format.

    While copying cells to clipboard, the header text is now also copied to the clipboard

    The CardOptionsPrint.PrintSelectedCardOnly property, if set to true, now enables the printing and exporting of all selected cards

    • In previous versions, if this property was set to true, only the focused card was printed

    XtraReports

    When a report is exported, postbacks are now always used instead of callbacks

    • The ReportViewer.ExportViaPostback property has been removed, because it is now always treated as True.

    Some ReportStringID constants have been removed because the corresponding properties' ReportStringID constants are now used instead

    • This was done in order to fix issue B32845.

    The following ReportStringID constants have been removed:

    • STag_Name_FillColor
    • STag_Name_ForeColor
    • STag_Name_LineWidth
    • STag_Name_Angle
    • STag_Name_AnchorVertical
    • STag_Name_Stretch
    • STag_Name_Shape
    • STag_Name_FormattingRules
    • STag_Name_FormattingRuleSheet
    • STag_Name_Fillet
    • STag_Name_TailLength
    • STag_Name_TipLength
    • STag_Name_NumberOfSides
    • STag_Name_StarPointCount
    • STag_Name_Concavity
    • STag_Name_ArrowHeight
    • STag_Name_ArrowWidth
    • STag_Name_VerticalLineWidth
    • STag_Name_HorizontalLineWidth
    • STag_Name_PrintOn
    • STag_Name_OLAPConnectionString
    • STag_Name_DataSource
    • STag_Name_DataMember
    • STag_Name_DataAdapter
    • STag_Name_Text
    • STag_Name_BackColor
    • STag_Name_Font
    • STag_Name_LineDirection
    • STag_Name_LineStyle
    • STag_Name_Summary
    • STag_Name_AutoWidth
    • STag_Name_CanGrow
    • STag_Name_CanShrink
    • STag_Name_Multiline
    • STag_Name_WordWrap
    • STag_Name_Symbology
    • STag_Name_Module
    • STag_Name_AutoModule
    • STag_Name_BarCodeOrientation
    • STag_Name_ImageSizing
    • STag_Name_ShowText
    • STag_Name_SegmentWidth
    • STag_Name_CheckState
    • STag_Name_Image
    • STag_Name_ImageUrl
    • STag_Name_ReportSource
    • STag_Name_Borders
    • STag_Name_BorderColor
    • STag_Name_BorderWidth
    • STag_Name_PageInfo
    • STag_Name_StartPageNumber
    • STag_Name_Format
    • STag_Name_RepeatEveryPage
    • STag_Name_PrintAtBottom
    • STag_Name_GroupUnion
    • STag_Name_GroupFields
    • STag_Name_SortFields
    • STag_Name_KeepTogether
    • STag_Name_Level
    • STag_Name_PrintOnEmptyDataSource
    • STag_Name_ReportUnit
    • STag_Name_StyleSheet
    • STag_Name_Watermark
    • STag_Name_FilterString

    BrickStringFormat: The default value of a PrototypeKind property has been changed from BrickStringFormatPrototypeKind.Default to BrickStringFormatPrototypeKind.GenericTypographic

    • This change may cause a report layout to be changed in some specific situations (e.g. the height of labels may be changed).

    The XtraReport.BackColor property no longer changes the page color

    • This change was done in order to fix issue B32611. Use the XtraReport.PageColor property instead

    XtraTreeList

    The type of the TreeListPainter.NodeDragImages and TreeListPainter.IndicatorImages properties has been changed to DevExpress.Utils.ImageCollection

  • Previewing v2009 vol 1: Datagrid and editors for WinForms

         

    These are the new features for the XtraGrid and Editors Suite.

    Windows Vista Style Filtering for Date-Time Columns

    For date-time columns, you can easily filter data using a handy filter dropdown. This now contains an embedded calendar. In addition, the filter dropdown also contains check boxes that allow the end-user to select commonly used date intervals: Today, Yesterday, Earlier this Week, etc. This provides a very intuitive interface for the task of picking  dates to create a filter.

    Date dropdown filter

    Note that end-users can easily select multiple dates, month or years by using drag and drop.

    Selction of dates by drag and drop

    Custom filter conditions are also allowed. You can populate the list below the calendar with any criteria you need. It's not even necessary for you to worry about providing actual start and end dates so that end-users can be sure which dates they are selecting when checking "Last Fiscal Year", for instance. When they hover any filter item with the mouse pointer, the grid will automatically display a tooltip showing the actual start and end dates.

    Filtered dates tooltip

    Sorting by Summary - End-User Capabilities

    In group mode, summaries can be calculated against groups of rows. Now, an end-user can sort group rows according to group summary values by using a context menu. To invoke this menu, right-click a grouping column's header.

    Sorting context menu

    When a grouping column is sorted in this manner, a special glyph is painted within its header.

    Captions for Grid Views

    You can enable titles for the grid control and detail View to display captions or any custom descriptive information to end-users. In addition, you can customize the font settings, alignment and foreground color for the title's text.

    Captions for grid views

    Improved Grid Layout Persistence

    The first improvement is the support for automatic saving/restoring of style conditions when the grid layout itself is saved/restored.

    Style conditions define rules for customizing the appearance of specific cells and/or rows. The style conditions can now be saved when the grid layout is saved to a data store (for instance, an XML file). Similarly, the style conditions are correctly restored when loading a grid layout. So, you can create style conditions at runtime and they will be correctly stored/restored without any additional code.

    The second improvement relates to the ability to automatically save/restore the information on sorting group rows by summary values.

    Group rows can be sorted according to group summary values by an end-user or in code. This information is now correctly stored/restored when a grid layout is stored/restored. So, if an end-user sorts group rows in a specific manner, this layout can be maintained between application runs without having to write any complicated code.

    Printing and Exporting Only Selected Rows

    With this feature, you can print/export only a subset of rows/cards. For instance, you can enable multiple selection mode, select a subset of rows/cards and then print or export them with ease.

    Advanced Incremental Filtering in Lookup Editors

    If text editing is enabled in a GridLookUpEdit control, an end-user can search for rows by typing text within the edit box. The new PopupFilterMode property specifies how the search is performed. By default, the control searches for the rows that contain the entered text at any position in the row's value. You can also force the control to search for the rows whose values begin with the entered text.

    Incremental filtering

    Miscellaneous Enhancements

    We have of course implemented various minor features from customer suggestions and requests.

    • Tooltip showing entire infoSummary values displayed within narrow columns might be clipped. Now, when hovering over summary values, a hint is displayed showing the full summary value plus any additional formatting applied. (See right.)
    • In Grid Views, we've added the maximum width property to the settings for a column. If you assume that the auto-width feature is enabled for a Grid View, then increasing the grid's width will proportionally resize all the columns. If you want to keep a small width for columns with little content, you can now specify their maximum width.
    • New options have been added to Banded Views that allow you to prevent all bands from being resized and/or moved.
    • With version v2009.1, copying cells to the clipboard also copies the column captions to the clipboard, allowing for the easy identification of cell data.
    • When an end-user navigates through grid cells using the Tab key, all row cells are processed one after another. However, in specific instances, when entering values, you may need to skip some cells. To do this, you can use a new TabStop option to prevent cells from being focused by the Tab key. This will allow your end-users to navigate using the Tab key through the columns while skipping some.
    • Vertical indenting By default, the grid displays detail data compactly, without extra indents. However, with the new DetailVerticalIndent property you can implement your own requirements for vertical detail padding. (See right, notice how the nested grid has extra padding top and bottom.)
    • When the grid is bound to a data source, columns are created for all fields in the data source. By default, the Caption properties of columns are set to empty strings. In v2009.1, the grid uses some heuristics to automatically generate human-readable column captions from field names and display them in column headers. For instance, if a field name is "CustomerName", the caption will be "Customer Name".
    • You can now enable automatic summary calculation for columns displaying TimeSpan values. No additional code is required.
  • Previewing v2009 vol 1: Datagrid and editors for ASP.NET

         

    These are the new features for ASPxGridView and Editors Suite.

    Masked Input

    We've added masked input to our text editors (ASPxTextBox and ASPxButtonEdit) and date editor (ASPxDateEdit). Our ASP.NET mask engine supports literals, digit and letter placeholders, ranges, enumerations, and date format specifiers (such as, yyyy, MM, dd, etc). Both the keyboard and the mouse wheel can be used to incrementally modify portions of the edit value.

    Virtual Paging

    We've improved our data navigation mechanism. In previous versions, your end-users had to use the built-in pager to switch between pages. From v2009.1 onwards, the user can do this by using the vertical scrollbar: the grid will automatically switch to the required page.

    ASPxGridView_VirtualPaging

    Horizontal Scrolling and Excel Style Column Freezing

    We've added horizontal scrolling. When using this feature, you can freeze individual columns within the grid, thus allowing your end-users to scroll through the other columns. A column can be fixed on the grid’s left edge.

    ASPxGridView_FixedColumns

    New Column Types

    In previous versions, you had to use templates to display images or progress bars within data cells. To make these particular tasks easier, we’ve added three additional column types:

    • Image Column – displays images located at the specified URLs.
    • Binary Image Column – displays images from a binary stream.
    • Progress Bar Column – allows you to indicate the progress of lengthy operations.

    Multi-Column Mode in List Box and Combo Box Controls

    The list data for the ASPxComboBox and ASPxListBox editors can now be displayed in more than one column. If a list editor is bound to a data source, you can define multiple columns for the editor's item list. Each list column displays data from the data source field you specify. For each column, you can define the header caption, width, visibility state, tooltip text, and unique identifier.

    For the ASPxComboBox editor, all its advanced features, such as incremental filtering, and loading items on demand via callbacks, are supported in multi-column mode. In addition, you can now define the format in which the selected item is represented within the ASPxComboBox editor's edit box by setting a single property.

    Prompt Text in ASP.NET Editors

    We have added the "empty text" feature for the text editors. This allows you to specify a prompt to be displayed in the text editor when there is no text present. This prompt disappears when the user starts to type in the editor.

    Minor Enhancements

    We've also added many minor features from customer suggestions and requests.

    • The new ShowInFilterControl column option has been added. It allows you to specify whether a column should be displayed in the ASPxGridView's Filter Control.
    • Previously, the ASPxComboBox sent a callback request immediately on each keypress while in filtering mode. Now you can define the timeout before the ASPxComboBox displays the item related to the typed text.
    • You can now create templates for displaying the grid’s Pager Bar.
    • A new server-side event has been added. It allows the text that represents the filter expression which is displayed within the filter bar to be replaced with a custom description.
    • End-users can now resize the Popup Edit Form.
    • The ability to specify the Customization Window’s size has been added.
    • Composite key fields are now supported. For instance, you can now specify a key field name in the following format: "FirstName;LastName;Phone;BirthDate".
    • The grid can now render empty data rows to keep its height constant, regardless of the data present. Previously, the grid would shrink vertically if there were too few rows to display. With the new option enabled, you can ensure that your page layout doesn't depend on the grid's data.
  • Previewing v2009 vol 1: scheduler for ASP.NET

         

    These are the changes to be introduced to ASPxScheduler in v2009 vol 1.

    Time Cell Customizations

    A new event has been implemented which occurs before a time cell is rendered. Handling this event gives you the opportunity to specify the style and color of a particular time cell and even insert a Literal control to display text.

    A new customization mechanism for the TimeCell interface elements, based on web templates, has been implemented. It provides the capability to insert text, hyperlinks, images, and additional web controls into the Scheduler's time cells. This method differs from the customization technique based on the HtmlTimeCellPrepared event in that you can insert an arbitrary web control but cannot change the container's style — that is, the text color, borders, and background. This technique extends the series of web template customizations that are already available for appointments, headers, and forms.

    Dialog Window Customization

    Several new events have been added to the ASP.NET scheduler so that you can customize the captions, size, and padding sizes of Popup Editor Dialogs.

  • Previewing v2009 vol 1: general controls for ASP.NET

         

    These are the new features for our ASPxperience Suite.

    Flow Mode in Data View Control

    With a flow layout, the items in the ASPxDataView will flow one after another even after the browser is resized. This allows you to automatically fill the page area in the best possible way.

    For example, let's suppose you have a page that displays a bunch of images. A flow layout allows the site to be 'stretchable'. Therefore, if the user has a larger monitor and wants to see more items, the ASPxDataView in flow layout mode will expand and fill the page area. This frees you from having to choose 2, 3, or however many columns may fit into your target client browsers. It's always the case that your power users want more data displayed, but you still have to cater for the smaller monitors too. Flow layout helps with that.

    Progress Indication while Uploading Files

    The newly-introduced Progress panel provides rich progress information during an upload process. The progress bar indicator shows the uploading progress visually. The cancel button can be used to cancel the uploading process.

    Minor Enhancements

    As with all our products we've added some customer requests too.

    • Data View controls that have no items to display are now rendered on a page anyway so that you can display a message indicating there's no data available.
    • You can now handle an event to prohibit end-users from closing Popup Windows.
Next page »
More from DevExpress
Live Chat
Have a pre-sales question?
Need assistance with your evaluation?
We are here to help.
Chat is one of the many ways you can contact members of the DevExpress Team. We are available Monday-Friday between 8:30am and 5:00pm Pacific Time.
If you need additional product information, require pre-sales assistance, or want help with your order, write to us at info@devexpress.com or call us at
+1 (818) 844-3383.