Introduction
I've been using the excellent VS2003 add-in called DataSet QuickWatch by Mohammed Barqawi, and also its enhanced version by Fahad Khalil, for a long time now. Visual Studio 2005 has Visualizers, but the default one for DataSet
s is too simplistic. So inspired by DataSet QuickWatch, I decided to create an advanced Visualizer for large DataSet
s.
The Code
One of the greatest features of Visual Studio 2005 is Visualizers. These are viewers for examining the values of complex type variables at runtime. The procedure I followed for creating a Visualizer was as follows:
Create the Visualizer
Create a project of type "Class Library". Rename your .cs file / class to your desired name.
Add a reference to Microsoft.VisualStudio.DebuggerVisualizers.dll and add the corresponding using
clause to your class.
using Microsoft.VisualStudio.DebuggerVisualizers;
Inherit your class from DialogDebuggerVisualizer
.
class DataSetWatch : DialogDebuggerVisualizer
{
...
...
Override the Show
method of the base class in your class. Intellisense helps here because when you type protected override and select Show, it automatically generates a signature of the function, saving you from some hand coding.
protected override void Show(IDialogVisualizerService windowService,
IVisualizerObjectProvider objectProvider)
{
...
...
Now, we need to tell Visual Studio what Types our visualizer will handle, this will be done with the following assembly attribute in AssemblyInfo.cs:
[assembly: System.Diagnostics.DebuggerVisualizer(
typeof(DataSetWatch.DataSetWatch),
typeof(VisualizerObjectSource),
Target = typeof( System.Data.DataSet),
Description = "DataSet Watch")]
Now that our class library has been setup, we can start writing code to get data from the debugger.
protected override void Show(IDialogVisualizerService
windowService, IVisualizerObjectProvider objectProvider)
{
DataSet ds = (DataSet)objectProvider.GetObject();
...
...
After the DataSet Watch dialog has been closed, the original DataSet
held by the debugger must be updated with changes made by DSWatch.
if ( objectProvider.IsObjectReplaceable) { objectProvider.ReplaceObject(ds); }
Create a Debugging Host
The Visualizer is now ready to use, and can be dropped into the My Documents\Visual Studio 2005\Visualizers directory. But during development, we need to debug it. This is not possible in the curent circumstances. First, we add a temporary hook to the Visualizer for debugging purposes. We add the following function to the DataSetVisualizer
class:
public static void TestShowVisualizer(object objectToVisualize)
{
VisualizerDevelopmentHost myHost = new
VisualizerDevelopmentHost(objectToVisualize, typeof(DataSetWatch));
myHost.ShowVisualizer();
}
So in order to overcome this debugging limitation, we add another Console Application type project into the solution that will act as a host for debugging the Visualizer.
Add a reference to the DataSetWatch project and to the Microsoft.VisualStudio.DebuggerVisualizers.dll.
At the point in your code where you want to inspect a test DataSet
, add the following call:
DataSetWatch.DSWVisualizer.TestShowVisualizer(ds);
This will launch the DataSet Watch window and allow you to debug its code.
... and that's pretty much it. Rest of the code is generic WinForms stuff, and isn't really worth discussing.
Features
DataSet Watch 2.0 provides the following enhancements over the classic add-in:
- Dynamically resizing controls and window (yay).
- Full-screen grid popup for viewing very large
DataSet
s.
- XML schema viewing support.
- Ability to add, rename, and remove tables to/from
DataSet
.
- Ability to hide selected tables in case there are many tables in the
DataSet
.
- Ability to add, rename, and remove columns to/from tables.
- Ability to hide selected columns in case of tables with large number of columns.
- Changes made to
DataSet
in DataSet Watch are reflected in the original DataSet
.
- Easy deployment, simply drop the DLL into My Documents\Visual Studio 2005\Visualizers.
- Row filtering.
- Typed DataSet support.
DataTable
support.
RowState
viewing support.
- Table relation create/edit/delete support (planned).
DataTable
snapshots allowing you to save a snapshot of a table for future reference (planned).
- Diff/Compare support for comparing a table with previous snapshots (planned).
- ... others (as suggestions come in).
History
- [15-11-2006] Build 4 is here !
- Added
TypedDataSet
support.