Click here to Skip to main content
Licence 
First Posted 11 Sep 2003
Views 530,434
Bookmarked 162 times

Multi-select ASP.NET datagrid

How to extend ASP.NET datagrid for multi-selection of data rows.

Sample image

Introduction

ASP.NET datagrid is a very powerful and flexible control, however some features like multi-select is not natively available. This article shows how easily this functionality can be achieved with a few simple tricks.

Background

One of the projects I was working on had a User Inteface requirement for multi-selection of grid rows. User wanted Hotmail or Yahoo style multi-selection facility along with highlighting the selection (hard part).

Using the code

After testing and applying some javascript and grid related coding techinque, I came up with the following working solution.

  • Add Template column for CHECKBOXES for selection (Hotmail/Yahoo style)
  • Add client-side onclick() and javascript for checkboxes, to highlight and mark checked rows.
  • Add server side CheckedChanged() event for preserving highlights. [because everytime on postback datagrid resets colors for the selection]
<Columns>
 <asp:TemplateColumn>
  <HeaderTemplate>
   <asp:CheckBox id="chkAll" 
      onclick="javascript:SelectAllCheckboxes(this);" runat="server" 
    AutoPostBack="false" ToolTip="Select/Deselect All" />
  </HeaderTemplate>
  <ItemTemplate> 
    <asp:CheckBox id="chkSelect" onclick="javascript:HighlightRow(this);"
        runat="server"OnCheckedChanged= "grdEmployees_CheckedChanged" 
        AutoPostBack="false" />
  </ItemTemplate> 
 </asp:TemplateColumn> 
</Columns>

SelectAllCheckBoxes()

This function is used to have Hotmail style selection, it iterate through every check box on the form and then selects/deselects the checkboxes.

HighlightRow()

The only challenge left was to highlight and un-highlight the rows on selection and deselection. For which, I used HighlightRow() function, please note one very important thing when using <asp:CheckBox> control. It surrounds <SPAN> tags around CHECKBOX and therfore in javascript you have to get the children of the <SPAN> tag.

    //-------------------------------------------------------------
    // Select all the checkboxes (Hotmail style)
    //-------------------------------------------------------------
    function SelectAllCheckboxes(spanChk){
    
    // Added as ASPX uses SPAN for checkbox 
    var oItem = spanChk.children;
    var theBox=oItem.item(0)
    xState=theBox.checked;    

        elm=theBox.form.elements;
        for(i=0;i<elm.length;i++)
        if(elm[i].type=="checkbox" && elm[i].id!=theBox.id)
            {
            //elm[i].click();
            if(elm[i].checked!=xState)
            elm[i].click();
            //elm[i].checked=xState;
            }
    }

    //-------------------------------------------------------------
    //----Select highlish rows when the checkboxes are selected
    //
    // Note: The colors are hardcoded, however you can use 
    //       RegisterClientScript blocks methods to use Grid's
    //       ItemTemplates and SelectTemplates colors.
    //         for ex: grdEmployees.ItemStyle.BackColor OR
    //                 grdEmployees.SelectedItemStyle.BackColor
    //-------------------------------------------------------------
    function HighlightRow(chkB)    {
    var oItem = chkB.children;
    xState=oItem.item(0).checked;    
    if(xState)
        {chkB.parentElement.parentElement.style.backgroundColor='lightcoral';
           // grdEmployees.SelectedItemStyle.BackColor
         chkB.parentElement.parentElement.style.color='white'; 
           // grdEmployees.SelectedItemStyle.ForeColor
        }else 
        {chkB.parentElement.parentElement.style.backgroundColor='white'; 
             //grdEmployees.ItemStyle.BackColor
         chkB.parentElement.parentElement.style.color='black'; 
             //grdEmployees.ItemStyle.ForeColor
        }
    }
    // -->

This was the client side story. So far so good. One may argue why not use the plain simple HTML checkbox control? The answer is ASP.NET server control has a viewstate and therefore posting a page retains the rows selection.

Server Side

Now, On the server side we have to make sure the highlights are intact, because on every postback ASP.NET renders grid and loses the highlights. Following method is used for re-rendering the highlights.

Public Sub grdEmployees_CheckedChanged(ByVal sender As Object, _
    ByVal e As System.EventArgs)
  Dim chkTemp As CheckBox = CType(sender, CheckBox)

  Dim dgi As DataGridItem 

  dgi = CType(chkTemp.Parent.Parent, DataGridItem)
  If (chkTemp.Checked) Then 

    dgi.BackColor = grdEmployees.SelectedItemStyle.BackColor 
    dgi.ForeColor = grdEmployees.SelectedItemStyle.ForeColor
  Else 

    dgi.BackColor = grdEmployees.ItemStyle.BackColor
    dgi.ForeColor = grdEmployees.ItemStyle.ForeColor 
  End If
End Sub

Getting your selection

Its easy! Iterate through the DataGridItems collection and grab the checkbox [for ex. DemoGridItem.Cells(0).Controls(1)]. And verify its CHECKED property. Oh, also you can use DataKeyField of the dataset to grab specific datarows. Check out the attached code and you will love to find out how easy it is to multi-select rows.

Conclusion

Follow the downloaded code, you can simply use any SQL database. This is my very first article, hope .NET lovers would like it. Feedback is welcome.

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

About the Author

Prashant Nayak (.Net Lover)

Web Developer

United States United States

Member

Cranking code more than 12 years. Technical/Project lead/MCSD. Offered services to various industuries like S/W, Telecom, Publishing, Insurance etc.
 
When not on computer, I play/swim/read with my kids and help my better half (of course my lovely wife) to clean house. Solving challenging S/W problems is my passion. Hate non-productive meetings. Do lots of GOOGLE and Eat/Drink/Sleep around MSDN.


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
GeneralMy vote of 5 Pinmembermanoj kumar choubey19:30 7 Feb '12  
GeneralMy vote of 5 PinmemberMember 782175610:23 21 Apr '11  
GeneralMy vote of 1 Pinmemberbadri vishal19:18 23 Nov '10  
GeneralMy vote of 1 PinmemberDima Pasko11:49 27 Aug '09  
GeneralMy vote of 1 PinmemberJitesh Sachdeva17:04 12 Jan '09  
GeneralMultiSelect via Client-Side PinmemberTodd Lucas12:31 1 Sep '06  
GeneralRe: MultiSelect via Client-Side PinmemberPatrick Olurotimi Ige14:44 19 Sep '06  
NewsMultiple Gridviews or Checkbox columns PinmemberMcDude13:10 15 Jun '06  
GeneralRe: Multiple Gridviews or Checkbox columns PinmemberCode Buster19:36 10 Aug '06  
Generalunselect check box based on others ckbx PinmemberJamshidi12:09 3 Mar '06  
GeneralCommand button in data Grid PinmemberS.Das20:28 2 Mar '06  
GeneralJavascript Functions PinmemberShadi Rahmani21:40 4 Sep '05  
GeneralRe: Javascript Functions Pinmemberenjoycrack0:12 5 Sep '05  
AnswerRe: Javascript Functions PinmemberSasi Atia20:52 12 Feb '06  
GeneralRe: Javascript Functions Pinmemberhb323:47 19 Mar '08  
Generalc# version PinmemberLoic Deniel22:16 23 Aug '05  
First of all, thanks for the code, it is very helpful
 
and for the those who are really lazy typing it Wink | ;) , here is the C# version of the server code:
 
public void grdEmployees_CheckedChanged(object sender, System.EventArgs e)
{
CheckBox myCheckBox = (CheckBox)sender;
DataGridItem dgi;
 
dgi = (DataGridItem)myCheckBox.Parent.Parent;
 
if(myCheckBox.Checked)
{
dgi.BackColor = grdEmployees.SelectedItemStyle.BackColor;
dgi.ForeColor = grdEmployees.SelectedItemStyle.ForeColor;
}
else
{
dgi.BackColor = grdEmployees.ItemStyle.BackColor;
dgi.ForeColor = grdEmployees.ItemStyle.ForeColor;
}
}

GeneralRe: c# version PinsussAnonymous8:04 26 Oct '05  
Questionhow to get cell Text when AutoGenerateColumns="false" Pinmemberhostlike19:57 4 Aug '05  
GeneralModified client script Pinmemberdpadevet3:26 21 Jul '05  
GeneralRe: Modified client script Pinmemberhtb huang12:32 19 Mar '07  
GeneralButton instead of CheckBox PinmemberJureshka4:53 7 Jul '05  
GeneralMozilla Firefox Browers Pinmembertaithien23:55 22 Jun '05  
GeneralRe: Mozilla Firefox Browers Pinmemberwildwildwolf9:50 20 Jul '05  
Generalscript correction Pinmember][Turpa0:51 28 Mar '05  
General, PinmemberHui Yee16:34 4 Mar '05  

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.120529.1 | Last Updated 8 Mar 2004
Article Copyright 2003 by Prashant Nayak (.Net Lover)
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid