Tuesday, November 29, 2005

Adding Javascript to ANY CommandField control

In the previous post, I mentioned how annoying it is to have to treat an ImageButton separate from a Button and separate from a LinkButton when they are all essentially the same thing.

The answer here lies in the IButtonControl interface, (whose name strongly suggests that it should be a direct parent, not an interface, but oh well)…

Here’s how you’d add javascript and tool tips to those CommandField button controls, without having to write specific versions for all three:

    1 protected void gvCrews_RowDataBound(object sender, GridViewRowEventArgs e)

    2         {

    3             //grab last column (the command column)

    4             int cmdCol = gvCrews.Columns.Count - 1;

    5             foreach (Control ctrl in e.Row.Cells[cmdCol].Controls)

    6             {           

    7                

    8                 IButtonControl btn = ctrl as IButtonControl;

    9 

   10                 if (btn != null)

   11                 {           

   12 

   13                     if (btn.CommandName == "Delete")

   14                     {

   15                         ((WebControl)ctrl).Attributes.Add("onClick", "return confirm('Are you sure you want to delete the crew and its ENTIRE history?  This cannot be undone...');");

   16                         ((WebControl)ctrl).ToolTip = "Click here to delete";

   17                     }

   18                     else if (btn.CommandName == "Edit")

   19                     {

   20                         ((WebControl)ctrl).ToolTip = "Click here to edit";

   21                     }

   22                 }           

   23             }   

   24         }

 This way I can still change the look & feel of the GridView CommandField and I don’t have to recompile to support it.  Unfortunately the IButtonInterface doesn’t allow for javascript attributes or tooltips, so I have to cast the control as a WebControl to add those in.  Setting CausesValidation=true still causes an exception for the ImageButton though, so I haven’t figured out a way around this yet.

Now playing: Nine Inch Nails - The Hand That Feeds

GridView CommandField Validation woes

Today I was working with a simple form, a single textbox at the top with a button for adding items, and a gridview below for editing/deleting.

With 2.0’s validation groups, we can have validation on the “Add” form by setting validationgroup=’AddGroup’ and we can have our CommandField column of the GridView have validationGroup=’editDelete’.  Ideally this will separate the 2 actions into their own validation groups and they won’t bother each other.

Well, if you are using ImageButtons instead of LinkButtons for your CommandField, there is a slight problem.  The ImageButton actually gets instantiated as DataControlImageButton, which cannot use the CausesValidation property.  Here’s what happens:

DumbException

Now why does this generate a NotSupportedException?  This is a perfectly valid scenario for validation?  In this particular case I do not care about the edit/delete validation, but I do care about the Add validation. 

If I change this scenario to work with LinkButton or just Plain Button, it all works out fine.

I have another rant regarding this same concept.  The above screenclip is showing the RowDataBound event handler, and I am looping through the controls in the last column of the GridView.  Now the last column is going to be the CommandField, so I know that there will be some commandcontrols in there.  At this point I should not care whether it is a Button, an LinkButton, or an ImageButton because I will be treating them all the same:  I will compare their CommandName properties to see what they are doing.  So why can’t I just cast the control as Button?  Well ImageButton doesn’t even derive from Button!  I am sure there are reasons for that, but I don’t see them.  This means I have to recompile my code if some UI guy decides they want a link instead of an image for their Edit command.  Dumb, I say.  An ImageButton, by nature, is a button, not an image.  It’s behavior is a button.  The way we treat it as developers is just like a button.  It’s view or representation however is an Image, just like a standard button has a raised, rounded rectange as its view.  Someone please explain to me why I’m wrong….

Now playing: Jimi Hendrix - Red House

Sunday, November 27, 2005

Engaged!

I proposed to my girlfriend, Silvia, on Thanksgiving in front of her entire family.  She said yes!  It was quite an occasion.  We aren’t yet sure when the date will be.

I’ll post some pictures of our trip to upstate New York soon, one of them has me on one knee .

Tuesday, November 15, 2005

vs2005 beta 2

Visual Studio 2005 Beta 2 is dying on me…  I wonder if it knows that I am about to replace it with the RTM version.

Any time I Rebuild All or run my app and play with it for 1 or 2 minutes Visual Studio just exits, no error message, no restart, nothing.  Makes it quite hard to develop, donchathink?

I am kind of reluctant to update to RTM too soon since we have apps in development under beta 2.

 

Now playing: Dave Matthews Band - All Along the Watchtower

Wednesday, November 09, 2005

A cool free online service.

I just thought I’d plug a cool website I found today.  It’s called Side Job Track and it’s pretty sweet.  It allows you to track side projects for just about any type of project.  Includes free invoicing, simple reports, and a client list.

This is perfect for my few-and-far-between computer service/networking jobs I get from time to time. 

Check it out, it’s totally free.

Now playing: Nirvana - The Man Who Sold The World

Monday, November 07, 2005

doh! of the day

Holy crap.  I can’t believe I wasted 45 minutes on this stupid, stupid, mistake.

When dealing with .NET and IDbCommands, you can execute the command in various ways:

  • ExecuteReader() – which will execute the command and return an IDataReader with the resultset loaded.
  • ExecuteScalar() – which will return a single value from the database, generally used for returning a COUNT or an @@IDENTITY
  • ExecuteNonQuery() – which is used for, well, just plain executing a query.  This function DOES have a return value, though:  the number of records affected.

I just spent almost an hour trying to figure out why this:

//Execute command and return the primary key of the item we just inserted
base
._id = Convert.ToInt32(cmd.ExecuteNonQuery());

was returning 1, always, even though the current primary key in that table is in the 90’s.

Looks like I need to get some sleep…

Now playing: Staind - Mudshovel - Winamp *** 1514. Staind - Mudshovel

Wednesday, November 02, 2005

My thoughts about the .NET Rocks! show in Austin

 

I’m listening to .NET Rocks! live in Austin right now (you can download it here)

I enjoyed listening to Jeffrey Palermo and Scott Bellware, as I read their blogs often.

I’d just like to vent about this moron:

Leeman

.. who said “C# Sucks!” live on the air.  His name is Leeman Schmitt.  Obviously this guy is incredibly narrow-minded, and cannot easily understand (let alone take advantage of) the differences and superiorities of another language.  VB.NET, while a great language, is not the panacea of development.  I get completely annoyed when someone is tied so tightly to ONE particular viewpoint on a problem.

I believe it was Scott Hanselman who said, “C# and VB.NET are just different flavors of IL” –  I couldn’t agree with this more.

Given the choice, I will choose C# because that’s what I prefer.  I don’t push it on anyone else, I don’t claim that it’s the best, or that everything else sucks.  I am perfectly happy to work on a project in VB.NET because I am versatile.  I would be happy to use PHP or Ruby, or JSP for that matter, since I believe being multi-faceted benefits my work in ALL languages.

I have been hearing a lot of this whiny attitude toward C# lately.  I wouldn’t hire anyone if they couldn’t program comfortably in VB.NET and C#.  I would also frown upon anyone who would just JUMP to using a particular technology for every problem they come across.

Anyway, I cast my blogvote to C#, thought I still respect any language or tool that will help me work productively. 

Ok, I’m done ranting…  flame on

Ed: Ok, so I was a little harsh.  Apparently there was more to this story.  So Leeman, no offense…  I just get really worked up about this topic

Tuesday, November 01, 2005

Extreme Programming Explained, 2nd Ed.

I just finished reading Extreme Programming Explained, 2nd Edition, by Kent Beck.

The book is a very easy read, weighing in at 160 pages.  I was able to easily finish it in the spare minutes I have during the day.

I thoroughly enjoyed the book and will be applying a few of the principles immediately at my job.  I enjoyed taking a break from purely technical book and focusing on values and principles.  There is also an extensive annotated bibliography in the back which will probably serve as my new-books-to-read source.

Next up is the Pragmatic Programmer, which I probably should’ve read a LONG time ago, but always put it off.  I’ll write a short review when I finish it.

Friday, October 21, 2005

Tooltips on Disabled buttons

I just realized It’s been a while since my last technical post, so I thought I’d share my latest frustration. (Don’t you just love those?)

Today’s frustration comes from the behavior of ToolTips in windows.  By default, if a control has it’s enabled property set to false (that’s disabled for you boolean challenged out there) then it will not receive the required mouse events for tool tips to function properly.

So for my “Save” button on a form, if it’s disabled, I’d sure like to tell the user WHY it’s disabled.  To me this seems like one of the more common uses of the tooltip.

An image will definitely help:

DisabledButtonTooltip

To accomplish this I had to put something invisible behind the button, but it still didn’t work properly, so you can see I shrunk the button just to get it to work.

I could display a status bar or something along those lines, but I don’t want to complain to the user until they actually try to click “Save Changes.”

I read in MFC you can use PreTranslateMessage to allow WM_MOUSEMOVE to be passed to a disabled button, but I don’t really have the time or the energy to do this in .NET. (unless someone else wants to give me some pointers…)

Sadly, a google search led me to only 1 possible quick-fix (putting a label or something behind the button and set the tooltip to that) ….  but it didn’t work.

Thursday, October 20, 2005

You're my boy Blue!

I’d just like to say… ahem:   “GO ASTROS!

 

That is all…

Now playing: Weezer - Tired Of Sex - Winamp *** 1639. Weezer - Tired Of Sex

Secured Loan - Credit Card Consolidation - Mortgage Calculator - Bad Credit Loans