dotnet DataGridExtensions: Modular extensions for the WPF DataGrid control

wpf advanced datagrid

The following example is a business object that shares similar constraints to the previous Person object; however, this object has a further rule that StartDate must be before EndDate. Validation within the WPF DataGrid occurs both at the cell level and at the row level. Cell level validation makes use of the standard Binding validation mechanisms which are described in great detail in this excellent CodeProject article.

Controlling row details visibility

  1. You can purchase it separately, or try it for 45 days by clicking the ‘Try it now’ button here, but it is also included in the Xceed Business Suite for WPF as well.
  2. Easily get started with the WPF DataGrid using a few simple lines of XAML or C# code example as demonstrated below.
  3. When the DataGrid is initialized, several methods are called in a specific order, all of these methods have been replaced to provide a specific implementation.
  4. For each column, it displays a CheckBox followed by the name of the column allowing the user to toggle the checkbox making the column visible or not.

In this article, I explained how to add the important missing features to the Avalonia DataGrid including Filtering, Layout saving/restoring and controlling the column visibility. These extra functionality comes for free from my open source NP.Ava.Visuals library. How to filter data from a datagrid across multiple columns without having to create code that looks like an oil refinery? The answer is ICollectionView which allows filtering with multiple predicates. This article covers creating a custom DataGrid Control that inherits from the base DataGrid control class and overrides some methods to implement filters for each column just like Excel. As you can see from the code listing, it’s mostly about expanding the details template into using a panel, which in turn can host more panels and/or controls.

Load Large Data Sets

The DataGrid also supports exporting to the CSV format, which is compatible with a wide variety of applications. The InsertionRow class represents a row in which values can be entered to insert a new item to the grid. I didn’t find any standard method to do it (AFAIK WPF provides way to clip the content to desired width, my problem is exactly opposite), so I come up with such ugly workaround, which does not work too well.

wpf advanced datagrid

Context menu

wpf advanced datagrid

To simplify this article, I won’t go into detail about customizing the column header, you will find the DataTemplate for the property DataGridColumn.HeaderTemplate in the file FilterDataGrid.xaml. In a professional project, I had to respond to a request from a user who wanted to be able to filter the columns of a list of data like Excel. This article has been a bit of a mixed-bag of samples; however, I hope that some of you out there will find something of use to you. The WPF DataGrid, although currently rough around the edges, is a control with great potential.

wpf advanced datagrid

Let’s continue by checking if the filter of the current field is already present in the list of filters, if it is the case, we recover it, otherwise we create a new one. The method OnItemsSourceChanged is responsible for initializing ICollectionView and defining the filter (which will be detailed later) as well as reinitializing the source collection loaded previously. The ShowPrintPreviewWindow and ShowPrintPreviewPopup methods provide print preview capabilities. ShowPrintPreviewPopup should be used when the application is being deployed as an XBAP, as XBAP applications cannot open new windows.

WPF – fill data on data grid

For a thorough DataSet tutorial, I would recommend this Data Access Layer tutorial. Fortunately, the absence of this control has not hampered the popularity of WPF. The versatility of the ListView control allows very flexible read-only DataGrid functionality.

PopUp example, I added a DateTime field to the DataTest test class for demonstration. The field Label is the displayed value, the field Content is the raw value, IsChecked is the state of the checkbox, and IsDateChecked is used for dates. At this point, we have implemented all the elements necessary for the operation of the filter seen in the previous demonstration. The method AddFilter of this class, is responsible for adding the predicate to the Dictionary of global scope, declared in the class FilterDataGrid. Here too it works well, but how to filter several elements with the same criterion? For example, filter [A, D] from the column Letter and [2, 3] from the column Number.

The ObservableCollection class is a good candidate for our data binding needs. It exposes a CollectionChanged event which is fired whenever items are added or removed from the collection. If we copy our customer data into an ObservableCollection and bind this to the DataGrid, we can handle the CollectionChanged event and perform the required operation on the DAL.

The WPF designer (Cider) does not follow the conventions of the Windows Forms and ASP.NET designers which indicate that a control has design-time support by the presence of a small button in the top right corner. And, the modified XAML below uses the ObjectDataPerovider class to define an instance of the above class as our data source. Note that we are still binding the DataGrid’s ItemsSource to the inherited DataContext. The source could just as easily have been a database table/view or even an XML file – the DataGrid is not picky about where it gets its data from.

Also, the lack of a DataGrid within the WPF APIs was an excellent opportunity for third party component providers; see Michael Sync’s blog for a roundup of the five leading third party WPF DataGrids. A Stats Editor Control which gives the user the ability to view, add, edit and remove the statistics displayed in StatRows. I would like to set such size for the DataGrid (standard, from WPF) so all cells (text) would be fully visible. I have window with DockPanel, with DataGrid in it, so when I resize the window, all nested widgets (DockPanel and DataGrid) are resized accordingly. Tooltips display additional information in a pop-up window when the pointer hovers over cells in the DataGrid. The WPF DataGrid provides auto-sizing options like auto-fit columns based on content, fit all columns within a view port, fill the last column to view port size, etc.

An Excel-like advanced filtering functionality is available when using auto filtering. This Advanced Filtering functionality can be used as an alternative to the FilterRow. To activate this feature, set the DataGrid’s AllowDrag property to true, and the DragBehavior property to “Select”.

Merged column headers can be used to present data more clearly and logically. Columns can be grouped (“merged”) under these merged headers, as can other groups of columns. Merged headers and their columns can be moved (drag-and-drop, programmatically) and removed / added back. The appearance of a grid when it is printed or exported is determined by the view assigned to a grid’s PrintView property and the theme assigned to the view’s Theme property. The last and empty row will let you add to the data source, simply by filling out the cells.

It would make sense to remove this column and the generated ID from the interface. The resulting window will contain a grid which displays all the columns of the Customers table, thanks to the AutoGenerateColumns property of the DataGrid which defaults to true. The datagrid allows users to select multiple items or cells using Left-Click and then dragging the mouse within the datagrid. This allows range selection to be performed without having to hold the Shift key on the keyboard. Instead of the default context menu style (shown above), the built-in dialog control can be used for a different look/behavior (shown below). The most common usage for the DataGrid is in combination with a database, but like most WPF controls, it works just as well with an in-memory source, like a list of objects.

I first searched the Internet for the suggested solutions that would allow me to implement this new functionality, but I did not find them satisfactory or they were incomplete. Connect and share knowledge within a single location that is structured and easy to search. However, there is no feedback to the user regarding the nature of the error, and there is no indicator on the row to alert the user. Currently, there is a lack of documentation and examples demonstrating common DataGrid usage scenarios (which is to be expected, as it is an out-of-band release). This article provides a number of simple usage examples which will hopefully be of use to anyone considering using the WPF DataGrid.

Bài viết liên quan