Click here to Skip to main content
Licence CPOL
First Posted 12 Jul 2006
Views 58,103
Downloads 37
Bookmarked 17 times

ASP.NET Color Picker

By | 12 Jul 2006 | Article
A web control for picking web-safe colors.

Sample Image - ColorPickerNET.gif

Introduction

On a recent project, I needed an ASP.NET color picker. I created an ASP.NET 2.0 WebControl which renders some HTML, CSS and JavaScript. No external files or libraries need to be included.

Using the Code

Extract the zip file and open the solution in Visual Studio 2005. Run the test page (default.aspx).

The color picker is a table with a lot of cells that have (web-safe) background colors:

colorpickerdiv += "<div id=\"colorpicker\">";
colorpickerdiv += "     <table cellpadding=\"0\" cellspacing=\"0\" " + 
                  "onclick=\"javascript:ColorPickerOnColorClick(event);\">";
string[] websafecolorlist = {"FFFFFF","CCCCCC","999999","666666","333333", 
        "000000","FFCC00","FF9900","FF6600","FF3300","FFFFFF",
        "FFFFFF","FFFFFF","FFFFFF","FFFFFF","FFFFFF","99CC00",
        "FFFFFF","FFFFFF","FFFFFF","FFFFFF","CC9900","FFCC33",
        "FFCC66","FF9966","FF6633","CC3300","FFFFFF","FFFFFF",
        "FFFFFF","FFFFFF","CC0033","CCFF00","CCFF33","333300",
        "666600","999900","CCCC00","FFFF00","CC9933","CC6633",
        "330000","660000","990000","CC0000","FF0000","FF3366",
        "FF0033","99FF00","CCFF66","99CC33","666633","999933",
        "CCCC33","FFFF33","996600","996600","663333","993333",
        "CC3333","FF3333","CC3366","FF6699","FF0066","66FF00",
        "99FF66","66CC33","669900","999966","CCCC66","FFFF66",
        "996633","663300","996666","CC6666","FF6666","990033",
        "CC3399","FF66CC","FF0099","33FF00","66FF33","339900",
        "66CC00","99FF33","CCCC99","FFFF99","CC9966","CC6600",
        "CC9999","FF9999","FF3399","CC0066","990066","FF33CC",
        "FF00CC","00CC00","33CC00","336600","669933","99CC66",
        "CCFF99","FFFFCC","FFCC99","FF9933","FFCCCC","FF99CC",
        "CC6699","993366","660033","CC0099","330033","33CC33",
        "66CC66","00FF00","33FF33","66FF66","99FF99","CCFFCC",
        "FFFFFF","FFFFFF","FFFFFF","CC99CC","996699","993399",
        "990099","663366","660066","006600","336633","009900",
        "339933","669966","99CC99","FFFFFF","FFFFFF","FFFFFF",
        "FFCCFF","FF99FF","FF66FF","FF33FF","FF00FF","CC66CC",
        "CC33CC","003300","00CC33","006633","339966","66CC99",
        "99FFCC","CCFFFF","3399FF","99CCFF","CCCCFF","CC99FF",
        "9966CC","663399","330066","9900CC","CC00CC","00FF33",
        "33FF66","009933","00CC66","33FF99","99FFFF","99CCCC",
        "0066CC","6699CC","9999FF","9999CC","9933FF","6600CC",
        "660099","CC33FF","CC00FF","00FF66","66FF99","33CC66",
        "009966","66FFFF","66CCCC","669999","003366","336699",
        "6666FF","6666CC","666699","330099","9933CC","CC66FF",
        "9900FF","00FF99","66FFCC","33CC99","33FFFF","33CCCC",
        "339999","336666","006699","003399","3333FF","3333CC",
        "333399","333366","6633CC","9966FF","6600FF","00FFCC",
        "33FFCC","00FFFF","00CCCC","009999","006666","003333",
        "3399CC","3366CC","0000FF","0000CC","000099","000066",
        "000033","6633FF","3300FF","00CC99","FFFFFF","FFFFFF",
        "FFFFFF","FFFFFF","0099CC","33CCFF","66CCFF","6699FF",
        "3366FF","0033CC","FFFFFF","FFFFFF","FFFFFF","FFFFFF",
        "3300CC","FFFFFF","FFFFFF","FFFFFF","FFFFFF","FFFFFF",
        "FFFFFF","00CCFF","0099FF","0066FF","0033FF","FFFFFF",
        "FFFFFF","FFFFFF","FFFFFF","FFFFFF"};

int rowcounter = 0;
bool needrowstart = true;
for (int i = 0; i < websafecolorlist.Length; i ++)
{
    if (needrowstart)
    {
        needrowstart = false;
        colorpickerdiv += "            <tr> ";
    }
    string color = "#" + websafecolorlist[i];
    colorpickerdiv += "                <td style=\"background-color:" + 
                      color + "\"></td>";
    if (rowcounter++ == 16)
    {
        colorpickerdiv += "            </tr>";
        needrowstart = true;
        rowcounter = 0;
    }
}
colorpickerdiv += "     </table>";
colorpickerdiv += "</div>";

if (!Page.ClientScript.IsClientScriptBlockRegistered("colorpickerdiv"))
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), 
                      "colorpickerdiv", colorpickerdiv);

The code above is a bit heavy and can be simplified, but the array of colors makes a nice image together. The table is surrounded by an invisible div. The table will be visible when the following code is fired:

opendialogscript += "    var ActiveColorPicker;\n";
opendialogscript += "    function OpenColorPicker(id)\n";
opendialogscript += "    {\n";
opendialogscript += "        ActiveColorPicker=id; \n";
opendialogscript += "        var colorpickerdiv=document." + 
                    "getElementById('colorpicker');\n";
opendialogscript += "        colorpickerdiv.style.visibility='visible';\n";
opendialogscript += "        colorpickerdiv.style.left=ActiveColorPicker" + 
                    ".style.left+ActiveColorPicker.style.width;\n";
opendialogscript += "        colorpickerdiv.style.top=window.event.y;\n";
opendialogscript += "        colorpickerdiv.style.left=window.event.x;\n";
opendialogscript += "    }\n";

And made invisible when a color has been clicked:

opendialogscript += "    function ColorPickerOnColorClick(e)\n";
opendialogscript += "    {\n";
opendialogscript += "        var td = (e.target) ? e.target : e.srcElement; \n";
opendialogscript += "        var color=td.style.backgroundColor; \n";
opendialogscript += "        ActiveColorPicker.style.backgroundColor=color;\n";
opendialogscript += "        ActiveColorPicker.style.color=color;\n";
opendialogscript += "        ActiveColorPicker.value=color;\n";
opendialogscript += "        var colorpickerdiv=document.getElementById('colorpicker');\n";
opendialogscript += "        colorpickerdiv.style.visibility='hidden';\n";
opendialogscript += "    }\n";

The following code is needed to render a clickable rectangle. The ID of the control is rendered with this.UniqueID. To store the color value, I use the value attribute from the textbox.

protected override void Render(HtmlTextWriter output)
{
    string html = "";
    string onclicker="onclick=\"javascript:OpenColorPicker(" + 
                     this.UniqueID + ");\"";
    html += "<input style=\"background-color:" + 
            SelectedHexValue + ";color:" + SelectedHexValue + 
            ";\" class=\"colorpickerbutton\" " + 
            onclicker + " readonly=\"true\" class=\"lookupmo" + 
            "dalvalue\" type=\"text\" name=\"" + 
            this.UniqueID + "\" value=\"" + 
            SelectedHexValue + "\">";
    output.Write(html);
}

Retrieving the value after a postback is done in LoadPostData:

public bool LoadPostData(String postDataKey, NameValueCollection values)
{
    SelectedHexValue = values[this.UniqueID];
    return false;
}

The color code can be get or set with the SelectedHexValue property. If you need a Color object or RGB int, just add properties that convert the HEX-code.

Label1.Text = ColorPicker1.SelectedHexValue;

Points of Interest

About web controls: LoadPostData is a tricky event. In order for it to fire, you must name one of the HTML controls exactly like the UniqueID of the control!

If you have any comments regarding the code, please feel free to email me at: colorpicker@toverstudio.nl.

History

  • 2006-07-11: Release 1.0.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Toverstudio

Web Developer

Netherlands Netherlands

Member

Loek van den Ouweland is a freelance Web Developer from The Netherlands.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralGood Work PinmemberNullpro22:21 2 Sep '09  
GeneralUse within UpdatePanel PinmemberMember 39029210:04 29 Jun '09  
Generalthis control not working in fire fox Pinmembervabiahv1:26 21 Jan '09  
GeneralGood work PinmemberBrij2:44 19 Dec '08  
GeneralRe: Good work PinmemberToverstudio2:58 19 Dec '08  
Questioncan u rectify the problem in the following article Pinmemberharish4485:16 6 Sep '08  
GeneralFix the position in firefox Pinmembersudjp0:23 29 May '08  
GeneralTo Make Compatible with Firefox PinmemberEyezed22:34 13 Mar '08  
GeneralRe: To Make Compatible with Firefox PinmemberToverstudio3:00 19 Dec '08  
QuestionClose the color picker PinmemberBruno Meirelles1:39 23 Nov '07  
QuestionControl within datagrid Pinmemberbillfoster0:59 26 Sep '07  
GeneralNice work Pinmembermarwamay23:50 1 Jul '07  
GeneralPopup Position when page has scrolled... Pinmemberjhornb10:54 20 Jun '07  
Generaltry this PinmemberViper300014:36 3 Jun '07  
QuestionHow To retrieve hexadecimal values? PinmemberIbrahim Dwaikat3:11 1 Feb '07  
AnswerRe: How To retrieve hexadecimal values? [modified] PinmemberScott T.4:01 9 Feb '07  
GeneralRe: How To retrieve hexadecimal values? PinmemberToverstudio23:28 25 Feb '07  
GeneralRe: How To retrieve hexadecimal values? Pinmemberarpitcompro20:11 13 Mar '07  
GeneralRe: How To retrieve hexadecimal values? PinmemberScott T.10:17 14 Mar '07  
GeneralRe: How To retrieve hexadecimal values? Pinmemberarpitcompro1:29 15 Mar '07  
GeneralRe: How To retrieve hexadecimal values? PinmemberScott T.2:29 15 Mar '07  
GeneralRe: How To retrieve hexadecimal values? Pinmemberarpitcompro3:00 15 Mar '07  
GeneralRe: How To retrieve hexadecimal values? PinmemberScott T.4:07 15 Mar '07  
GeneralNice! Pinmemberbraham58:57 7 Oct '06  
GeneralRe: Nice! PinmemberToverstudio23:28 25 Feb '07  

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.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 12 Jul 2006
Article Copyright 2006 by Toverstudio
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid