Reflection IT Blog

Benieuwd naar de laatste ontwikkelingen rondom software ontwikkeling en Reflection IT? Onze slimme koppen delen regelmatig hun kennis en ervaring. Zo weet jij wat er speelt!

framework tagged Blog posts

Paging in ASP.NET Core MVC and EntityFramework Core

29-Mar-2017 60 Comments

Paging, sorting and filtering are common features in websites. Microsoft has written a tutorial how to implement these features in ASP.NET Core MVC with Entity Framework Core. The described solution works but I found it a bit too primitive. It triggered me to create a more powerful solution. Before you can start using my solution you should first read this tutorial, it explains how you can add Entity Framework Core to an ASP.NET Core MVC application.



I have just received mail from Pearson VUE informing me that have passed the Beta Exam 70-528 TS: Microsoft .NET Framework 2.0 - Web-Based Client Development (called 71-528 while it's in Beta). I also received a free Voucher for a next exam, thanks guys.

On Friday I will try the Beta Exam 70-551 UPGRADE: MCAD Skills to MCPD Web Developer by Using the Microsoft .NET Framework. One week later I will try the Beta Exam70-552 UPGRADE: MCAD Skills to MCPD Windows Developer by Using the Microsoft .NET Framework . Wish me luck.

Microsoft has put my 'Dual List' .NET Magazine article online!


Microsoft has put my Visueel programmeren met .NET: Dual List Control article online. It is published in the .NET Magazine #8 and it is free for Dutch developers.
They didn't publish the sourcecode (yet) but you can download it from my own site. The aricle is in Dutch. You can find an (old) English version of this article here. An even more advanced implementation that also supports Drag & Drop can be found here.



For a long time I thought that I only had to set the Cursor.Current to a WaitCursor before a long running operation, the .NET runtime would reset it back to the Default cursor. Turns out that this is only true when the mouse is moved. Bummer.

// Cursor.Current are automatically reset to Default when the
// mouse is moved and the application is idle!
Cursor.Current = Cursors.WaitCursor;

The solution for this problem is very easy. I created a helper class called WaitCursor which set the Cursor.Current and restores it to the original value when it it disposed.

public sealed class WaitCursor : IDisposable {   &nbsp   &nbsp   &nbsp   &nbsp
   &nbspprivate Cursor _prev;

   &nbsppublic WaitCursor(){
   &nbsp   &nbsp_prev= Cursor.Current;
   &nbsp   &nbspCursor.Current = Cursors.WaitCursor;

   &nbsppublicvoid Dispose(){
   &nbsp   &nbspCursor.Current =_prev;

I create the instance of the WairCursor class inside a using statement. This will automatically call the Dispose() method when it goes out of scope.

Dispose Modal WinForm Dialogs


There is a difference in disposing Modal and Non-Modal forms. In a training I gave last week I noticed that even experienced developers didn't know that Modal Dialogs don't dispose automatically, Non-Modal do.

private void buttonShowNonModalForm ( object sender , System.EventArgs e){
   &nbspnew TestForm().Show();

privatevoidbuttonShowModalDialog(objectsender, System.EventArgs e){
   &nbspnew Form2().ShowDialog();

The solution to this problem is very simple by creating the Form instance within a using block. This will dispose the Form when it is closed.

private void buttonShowModalDialog ( object sender , System.EventArgs e){
   &nbspusing(TestForm f =new TestForm()){
   &nbsp   &nbspf.ShowDialog();

An alternative solution uses a try/finnaly. Personally I prefer the previous, it is easier to read and write.

DualList Drag & Drop Component


I have written an article two years ago with the title 'WinForm DualList Component'. In this article I mentioned the desire to extend the DualList component with Drag & Drop support. Finally it's done. Not by extending the original DualList component but by creating an new DualListDragDrop component (reason: cohesion).

Programming Drag & Drop (D&D) between listboxes is quite difficult. It requires at least 60 lines of code for every two listboxes. Therefore not many application support D&D. This component eliminates need of writing the code. You only have to set properties on it. Making it easy to support D&D in your applications.

System.Collections and System.Collections.Specialized


This table gives you an overview of all collections in the System.Collections and System.Collections.Specialized namespaces.

Class Key Value Remarks
System.Array   ? Predefined size, used for passing data around.
ArrayList   Object Easy to work with, provides basic collection functionality and can easily be converted to an Array.
BitArray   Boolean
Manages a compact array of bit values, which are represented as Booleans
CollectionBase   ? Abstract base for building your own collection classes.
DictionaryBase Object ? Abstract base for building your own collection classes using a key-value pair.
HashTable Object Object Provides high performance access to items in the key-value pair collection, by a specific key.
Queue   Object Implements the FIFO mechanism.
ReadOnlyCollectionBase   Object Abstract base for building your own read-only collection classes.
SortedList Object (sorted) Object Provides access to items in the collection by a specific key or an index (GetByIndex(int)).
Stack   Object Implements the LIFO mechanism.
Object Object Uses internally a ListDictionary class when the collection is small, and switches automatically to a Hashtable class when the collection gets large.
Specialized.ListDictionary Object Object Is designed to be used for collections with 10 or less items, while the Hashtable is designed to contain more items.
Specialized.NameObjectCollectionBase String ? Abstract base for building your own collection classes using a key-value pair.
Specialized.NameValueCollection String (sorted) String NameValueCollection class is the strong type equivalent of the SortedList class, for the String class.
Specialized.StringCollection   Object Strongly typed ArrayList for the String class.
Specialized.StringDictionary String String Strongly typed Hashtable for the String class, not sorted.

Read also Jan Tielens article on the MSDN Belux website.

EventsHelper using Fire and Forget


I have used the EventsHelper class to fire events asynchronical. I came across this class in the TechEd 2003 presentation C# Best Practices from Eric Gunnerson and Juval Löwy. Today I noticed a bug. The FireAsync() method uses the 'Fire and Forget' pattern incorrectly.

The 'Fire and Forget' pattern is used when the return value and returned parameters of the call are not required, and when there is no need to synchronize with the asynchronously executing method. In this case, the caller simply needs to call BeginInvoke, passing any normal and ref parameters, and null for the callback and asyncState.

This has been a commonly used pattern. However, there has been a documentation change in version 1.1 of the .NET Framework that has big ramifications for this technique of making async calls. The documentation now states that EndInvoke must be called for a corresponding BeginInvoke--otherwise Microsoft say they may now, or in the future, leak resources. It appears that no resources are leaked under version 1.0 of the framework; however, with this type of warning in place, it is recommended that a call to EndInvoke be made even if the return values of an async call are not required.

It is relatively straightforward to create a helper class that handles this for you--one example I found here.

public class AsyncHelper {

   &nbspdelegatevoid DynamicInvokeShimProc(Delegate d,object[]args);

   &nbspstatic DynamicInvokeShimProc dynamicInvokeShim=new
   &nbsp   &nbspDynamicInvokeShimProc(DynamicInvokeShim);

   &nbspstatic AsyncCallback dynamicInvokeDone=new
   &nbsp   &nbspAsyncCallback(DynamicInvokeDone);

   &nbsppublicstaticvoid FireAndForget(Delegate d,paramsobject[]args){
   &nbsp   &nbspdynamicInvokeShim.BeginInvoke(d,args,dynamicInvokeDone,null);

   &nbspstaticvoid DynamicInvokeShim(Delegate d,object[]args){
   &nbsp   &nbspd.DynamicInvoke(args);

   &nbspstaticvoid DynamicInvokeDone(IAsyncResult ar){
   &nbsp   &nbspdynamicInvokeShim.EndInvoke(ar);

DateDiff() function in C#

11-Feb-2004 4 Comments

I have written the following DateDiff() function in C#. VB.NET users already had it using the Micrsoft.VisualBasic.dll assembly. Now you can use it without referencing this 'ugly' extra assembly.

using System;

namespace ReflectionIT.System {

   &nbsppublicenum DateInterval {
   &nbsp   &nbspYear,
   &nbsp   &nbspMonth,
   &nbsp   &nbspWeekday,
   &nbsp   &nbspDay,
   &nbsp   &nbspHour,
   &nbsp   &nbspMinute,
   &nbsp   &nbspSecond

   &nbsppublicclass DateTimeUtil {

   &nbsp   &nbsppublicstaticlong DateDiff(DateInterval interval, DateTime date1, DateTime date2){

   &nbsp   &nbsp   &nbspTimeSpan ts=date2-date1;

   &nbsp   &nbsp   &nbspswitch(interval){
   &nbsp   &nbsp   &nbsp   &nbspcase DateInterval.Year:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturndate2.Year -date1.Year;
   &nbsp   &nbsp   &nbsp   &nbspcase DateInterval.Month:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturn(date2.Month -date1.Month)+(12*(date2.Year -date1.Year));
   &nbsp   &nbsp   &nbsp   &nbspcase DateInterval.Weekday:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturn Fix(ts.TotalDays)/7;
   &nbsp   &nbsp   &nbsp   &nbspcase DateInterval.Day:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturn Fix(ts.TotalDays);
   &nbsp   &nbsp   &nbsp   &nbspcase DateInterval.Hour:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturn Fix(ts.TotalHours);
   &nbsp   &nbsp   &nbsp   &nbspcase DateInterval.Minute:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturn Fix(ts.TotalMinutes);
   &nbsp   &nbsp   &nbsp   &nbspdefault:
   &nbsp   &nbsp   &nbsp   &nbsp   &nbspreturn Fix(ts.TotalSeconds);
   &nbsp   &nbsp   &nbsp}
   &nbsp   &nbsp}

   &nbsp   &nbspprivatestaticlong Fix(double Number){
   &nbsp   &nbsp   &nbspif(Number >=0){
   &nbsp   &nbsp   &nbsp   &nbspreturn(long)Math.Floor(Number);
   &nbsp   &nbsp   &nbsp}
   &nbsp   &nbsp   &nbspreturn(long)Math.Ceiling(Number);
   &nbsp   &nbsp}

Get in touch

Met dit formulier kunt u informatie over een In-Company of Small-Group training aanvragen. U kunt in het bericht aangeven welke training u wilt, voor hoeveel personen, wanneer deze verzorgd moet worden en op welke locatie. Wij nemen vervolgens contact met u op.

U kunt ons ook bereiken via telefoonnummer +31 (0)493-688810 of per mail