I tried to use the following example, to add a checkbox column to a
DataGrid in an ASP.NET application:
http://www.codeproject.com/aspnet/datagridcheckbox.asp
For some reason, I simply CAN'T get the example to work. I created the
following two classes, provided with the example:
*-*-**-*-*-*-*-*-*-*-*-*-**-*-*-*-*-CheckBoxColumn
Class:-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-**-*-*-*
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.W ebControls;
using System.Data;
namespace DataGridTest2
{
/// <summary>
/// Summary description for CheckBoxColumn.
/// </summary>
public class CheckBoxColumn
:System.Web.UI. WebControls.Tem plateColumn
{
/// <summary>
/// Initialise our CheckBoxColumn.
/// </summary>
public CheckBoxColumn( )
{
// set the view one as readonly
//viewItem = new CheckBoxItem(fa lse); // SAW was false
viewItem = new CheckBoxItem(tr ue);
this.ItemTempla te = viewItem as ITemplate;
// let the edit check box be editable
editItem = new CheckBoxItem(tr ue);
this.EditItemTe mplate = editItem as ITemplate;
}
/// <summary>
/// Initialise our CheckBoxColumn with an optional
ImmediatePostba ck capability.
/// </summary>
/// <param name="Immediate Postback">If true then each change
of state of the
/// CheckBox item
/// will cause an event to be fired immediately on the
server.</param>
public CheckBoxColumn( bool ImmediatePostba ck)
{
// set the view one as readonly
viewItem = new CheckBoxItem(Im mediatePostback );
this.ItemTempla te = viewItem as ITemplate;
// let the edit check box be editable
editItem = new CheckBoxItem(tr ue);
this.EditItemTe mplate = editItem as ITemplate;
AutoPostBack = ImmediatePostba ck;
}
/// <summary>
/// Occurs when the value of the Checked property changes
between posts to the
/// server.
/// </summary>
/// <remarks>
/// The <b>CheckedChang ed</b> event is raised when the value
of the Checked
/// property changes
/// between posts to the server.
/// <b>Note</b> This event does not post the page back to
the server unless the
/// AutoPostBack property is set to true.
/// <b>Note</b> The control must have viewstate enabled for
the
/// <b>CheckedChang ed</b> event to work correctly.
/// </remarks>
public event EventHandler CheckedChanged
{
add
{
viewItem.Checke dChanged += value;
editItem.Checke dChanged += value;
}
remove
{
viewItem.Checke dChanged -= value;
editItem.Checke dChanged -= value;
}
}
/// <summary>
/// If true then then each click on a CheckBox will cause an
event to be fired on the
/// server.
/// </summary>
public bool AutoPostBack
{
set
{
viewItem.AutoPo stBack = value;
editItem.AutoPo stBack = value;
}
get
{
return viewItem.AutoPo stBack;
}
}
/// <summary>
/// The DataField that we wish our control to bind to.
/// </summary>
public string DataField
{
get
{
return viewItem.DataFi eld;
}
set
{
viewItem.DataFi eld = value;
editItem.DataFi eld = value;
}
}
/// <summary>
/// Internal storage of the CheckBoxItem that is to be used
for the view state.
/// </summary>
private CheckBoxItem viewItem;
/// <summary>
/// Internal storage of the CheckBoxItem that is to be used for
the edit state.
/// </summary>
private CheckBoxItem editItem;
}
}
*-*-**-*-*-*-*-*-*-*-*-*-**-*-*-*-*-CheckBoxItem
Class:-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-**-*-*-*
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.W ebControls;
using System.Data;
namespace DataGridTest2
{
/// <summary>
///
/// </summary>
internal class CheckBoxItem : ITemplate
{
/// <summary>
/// The CheckBoxItem constructor
/// </summary>
/// <param name="editable" >true if the item is to be in its
editable state, false for the
/// item to be
/// disabled.</param>
public CheckBoxItem(bo ol editable)
{
readOnly = (editable==true )?false:true;
}
/// <summary>
/// Instantiates the CheckBox that we wish to represent in
this column.
/// </summary>
/// <param name="container ">The container into which the
control or controls are
/// added.</param>
void ITemplate.Insta ntiateIn(Contro l container)
{
CheckBox box = new CheckBox();
box.DataBinding += new EventHandler(th is.BindData);
box.AutoPostBac k = autoPostBack;
box.CheckedChan ged += new
EventHandler(th is.OnCheckChang ed);
container.Contr ols.Add(box);
}
/// <summary>
/// Our CheckChanged event
/// </summary>
public event EventHandler CheckedChanged;
/// <summary>
/// This is a common handler for all the Checkboxes.
/// </summary>
/// <param name="sender">T he raiser of this event a
CheckBox.</param>
/// <param name="e">A System.EventArg s that contains the
event data.</param>
private void OnCheckChanged( object sender, EventArgs e)
{
if (CheckedChanged != null)
{
CheckedChanged( sender, e);
}
}
/// <summary>
/// The internal storage for which DataField we are going to
represent.
/// </summary>
private string dataField;
/// <summary>
/// Used to set the DataField that we wish to represent with
this CheckBox.
/// </summary>
public string DataField
{
get
{
return dataField;
}
set
{
dataField=value ;
}
}
/// <summary>
/// The internal storage for the AutoPostback flag.
/// </summary>
private bool autoPostBack=fa lse;
/// <summary>
/// Set the AutoPostBack flag. If this is true then each time
a CheckBox is clicked
/// in the Column that contains this item then an event is
raised on the server.
/// </summary>
public bool AutoPostBack
{
set
{
autoPostBack = value;
}
get
{
return autoPostBack;
}
}
/// <summary>
/// Handler for the DataBinding event where we bind the data
for a specific row
/// to the CheckBox.
/// </summary>
/// <param name="sender">T he raiser of the event.</param>
/// <param name="e">A System.EventArg s that contains the
event data.</param>
private void BindData(object sender, EventArgs e)
{
CheckBox box = (CheckBox) sender;
DataGridItem container = (DataGridItem)
box.NamingConta iner;
box.Checked = false;
box.Enabled = (readOnly == true) ? false:true;
string data = ((DataRowView)
container.DataI tem)[dataField].ToString();
Type t =
((DataRowView)c ontainer.DataIt em).DataView.Ta ble.Columns
[dataField].DataType;
if (data.Length>0)
{
switch (t.ToString())
{
case "System.Boolean ":
if (( data == "True") || (data == "true"))
{
box.Checked = true;
}
break;
default:
break;
}
}
}
/// <summary>
/// Internal storage for the readOnly flag.
/// </summary>
private bool readOnly = true;
}
}
*-*-*-*-*-*-*-*-*-*-*-*-*-*Custom Control Code Behind
Page:-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*
namespace DataGridTest2
{
using System;
using System.Collecti ons;
using System.Componen tModel;
using System.Data;
using System.Data.Sql Client;
using System.Drawing;
using System.Web;
using System.Web.Sess ionState;
using System.Web.UI;
using System.Web.UI.W ebControls;
using System.Web.UI.H tmlControls;
/// <summary>
/// Summary description for OrderPickerCont rol.
/// </summary>
public class OrderPickerCont rol : System.Web.UI.U serControl
{
protected System.Web.UI.W ebControls.Data Grid DataGrid1;
SqlConnection cn;
SqlDataAdapter da;
DataSet ds;
private void Page_Load(objec t sender, System.EventArg s e)
{
cn= new SqlConnection
("Server=localh ost;uid=sa;pwd= pwd;database=te stDB");
da= new SqlDataAdapter ("SELECT CustID, IsComplete FROM
Orders ", cn);
ds= new DataSet ();
da.Fill (ds, "Orders");
DataGrid1.DataS ource =ds.Tables[0];
// Add the new column to the DataGrid
CheckBoxColumn chkColumn = new CheckBoxColumn( );
chkColumn.Heade rText = "Include?";
chkColumn.DataF ield = "IsComplete ";
//chkColumn.AutoP ostBack = true;
//chkColumn.Check edChanged +=new EventHandler(th is.o);
DataGrid1.Colum ns.Add(chkColum n);
DataGrid1.DataB ind ();
}
#region Web Form Designer generated code
override protected void OnInit(EventArg s e)
{
//
// CODEGEN: This call is required by the ASP.NET Web
Form Designer.
//
InitializeCompo nent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeCompo nent()
{
this.Load += new System.EventHan dler(this.Page_ Load);
}
#endregion
}
}
The DataGrid is bound properly, and shows the correct state of the
check boxes for the underlying SQL bit datatype field (IsComplete).
What I can't figure out is how to immediately update the database, once
a checkbox has been checked or unchecked. I was unable to determine how
to do this, based on the example. The IsComplete field contains either
0 values for false, or 1 values for true. Checking the checkbox should
change the 0 values to 1 values (and unchecking should change 1 values
to 0 values). I also want to be able to refresh the DataGrid to show
these changes. (I thought that AutoPostBack would accomplish this, but
I had no luck getting it to work.)
The worst part of it is I know that I'm probably missing something
obvious, due to my lack of experience. Needless to say, any help,
advice, snippets, etc. would be greatly appreciated.
THANKS!!!