Click here to Skip to main content
Click here to Skip to main content

Adding Guidelines to Visual Studio

, 14 Aug 2006
Rate this:
Please Sign up or sign in to vote.
A simple tool with a simple purpose, to add column guidelines to Visual Studio.

Sample Image - Guidelines.png

Introduction

When I logged on to CodeProject this morning, the weekly poll asked the question, "How wide is your source code?". This led to a discussion in the forums, where Vikram posted a link to this article by Sara Ford:

The article details a little hack that you can make to the registry so that one or more "guidelines" can be dispalyed in Visual Studio. (See the image above for an example of what this looks like in the editor.) So the bottom line is, the end result of this article isn't really due to my own bright idea - the only original part of this is in creating a tool to perform the registry hack for you, with minimal effort on your part.

I won't bother to rehash the content of the article here, as you can read it freely from Sara's blog. I will simply address the tool, and what went into it.

The Tool

The tool is so simple it's almost silly to review it. It took me about 10 minutes to hack together from start to finish. (Update: with all the updates listed below, I'd say there is roughly five hours of work in this now.) Basically, it allows you to select a color to set the guidelines to, and to enter a list of column addresses to place the guidelines at. Click "Apply" and the changes are made. Click "Remove" and the changes are removed. It's a no brainer.

The changes are made through some simple calls to the registry.

private void btnApply_Click(object sender, EventArgs e)
{
    if (txtPreview.Text != "" && txtLocations.Text != "")
    {
        // Create a new key 
        RegistryKey key = 
           Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\" + 
           "VisualStudio\\8.0\\Text Editor", true);
        // Set value of sub key
        key.SetValue("Guides", txtPreview.Text);
	key.Close();
    }
}
private void btnRemove_Click(object sender, EventArgs e)
{
    RegistryKey delKey = 
         Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\" + 
         "VisualStudio\\8.0\\Text Editor", true);
    delKey.DeleteValue("Guides");
    dekKey.Close();
}

The IsNumeric Problem

C# is a wonderful language, but every now and then, you wander into a situation that leaves you scratching your head in disbelief. One of the things I wanted to do was to make sure that the list of guideline locations was a comma seperated list of integers. My first thought (being an old VB programmer at heart) was to simply Split() the string and check to see if each value was a number by asking "IsNumeric()"? But lo and behold, C# has no such function! The Char type has a similar function, but not String.

My first attempt (and you might have downloaded this copy, see the update below) was to Split() the string, and then "borrow" the function by stealing from VB, like this:

private bool IsNumeric(string value)
{
    return Microsoft.VisualBasic.Information.IsNumeric(value);
}

That worked just fine for the most part, then I realized that you could still enter a value such a -9, or 9.5, and it would pass muster. While those values probably wouldn't hurt anything, they weren't helping it any either, so I came up with a new plan, and the one I should have gone with in the first place, using a regular expression to validate the input. Not only did this minimize a lot of code in my program, but it works better in the end.

private bool verifyLocations(string locations)
{
    Regex regex = new Regex("^(\\d|,)*\\d*$");
    return regex.IsMatch(locations.Replace(" ", ""));
}

Update (Aug 14, 2006)

This article and code has been updated since the initial release. The following features and changes have been implemented:

  • Error checking is now included
  • The preview textbox is readonly
  • The preview textbox now correctly updates when you change the guideline locations
  • The registry is now explicitly closed after each transaction, as reccomended in the comments below
  • A help file is included
  • Settings are persisted between sessions
  • Error checking is now via Regex, much less coding and no VB reference required
  • Program now reads in value from registry as requested in comments below
  • More comments added to the source code
  • Now handles VS 2003 & VS 2005
  • Help greatly expanded
  • UI changed to reflect new features
  • Error handling now uses the ErrorProvider model and is handled more appropriately
  • Some minor spelling errors corrected
  • Reduced the size of the source file
  • Added tab stops
  • Max. # of guidelines is now enforced
  • Bugfix: Preview color now displays correctly when loading from registry
  • Bugfixes: load()
  • Bugfixes: several required null checks 

Known Problems

The code is pretty solid now. The only known "bug" is that I don't currently check for maximum column values - you could enter 20,000 as a column, and unless you have a monitor that wraps around the entire room, you'd never see it. This being a developer tool, I felt it was uneccessary to spell this out.

Special Thanks

To all the people who made suggestions for this tool, especially to Gordon Brandly who suggested some of the UI updates and provided the code to make this work with VS2003. Also, thanks to those of you who put in a 5 vote for this article, I really appreciate it.

Disclaimer

This tool is free and open source, so do what you want with it. Giving me some credit somewhere, for it would be nice, but not required. It does make changes to your registry, so backup your registry before using it! I take no resonsibility for any damage caused to your system by this tool.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Todd Davis
Systems Engineer Virtual RadioLogic
United States United States
Todd Davis has been working in web and application development for several years, using Silverlight, ASP.NET, VB.NET, C#, C++ and Javascript, as well as a great deal of work with SQL server and IIS.
 
He currently works for Virtual Radiologic in Eden Prairie, MN, however he is better known for his varied work in the open source community, especially the DotNetNuke project for which he provided several world-renowned training videos and modules. A huge advocate of open source and open knowledge sharing, everything on his website (www.SeaburyDesign.com) is always offered for free.
 
Whenever he is not actively coding at his laptop (a rarity to be sure), he can be found woodworking, walking with his wife and kids, or motoring along the back roads of MN on his Harley Davidson Fatboy.

Comments and Discussions

 
GeneralRe: Bug or feature? PinmemberGordon Brandly14-Aug-06 8:43 
GeneralRe: Bug or feature? PinmemberTodd Davis14-Aug-06 14:41 
GeneralThank you PinadminChris Maunder10-Aug-06 1:05 
GeneralRe: Thank you PinmemberTodd Davis10-Aug-06 3:36 
Me either, as it seems like people want it. After I get this ironed out, I might try and turn this into a VS plugin for convenience sake, although I think most people will tend to run this once and then forget about it afterwards.
 
-Todd Davis (toddhd@gmail.com)

GeneralRead existing registry values [modified] PinmemberOlaf Herrmann9-Aug-06 23:01 
GeneralRe: Read existing registry values PinmemberTodd Davis10-Aug-06 3:34 
QuestionDotted lines for function body ?? PinmemberLukky9-Aug-06 22:56 
AnswerRe: Dotted lines for function body ?? PinmemberTodd Davis10-Aug-06 3:31 
GeneralUpdates PinmemberTodd Davis9-Aug-06 16:06 
GeneralGreat little program -- works good with VS 2003 too PinmemberGordon Brandly9-Aug-06 12:16 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.1411028.1 | Last Updated 14 Aug 2006
Article Copyright 2006 by Todd Davis
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid