
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.
function SelectAllCheckboxes(spanChk){
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)
{
if(elm[i].checked!=xState)
elm[i].click();
}
}
function HighlightRow(chkB) {
var oItem = chkB.children;
xState=oItem.item(0).checked;
if(xState)
{chkB.parentElement.parentElement.style.backgroundColor='lightcoral';
chkB.parentElement.parentElement.style.color='white';
}else
{chkB.parentElement.parentElement.style.backgroundColor='white';
chkB.parentElement.parentElement.style.color='black';
}
}
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.