Hope someone can help with this....

I recently incorporated these two classes into my code which dynamically adds a checkbox column to my datagrid.

public 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(bool 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.InstantiateIn(Control container) 
    {
        CheckBox box = new CheckBox();
        box.DataBinding += new EventHandler(this.BindData);
        box.AutoPostBack = autoPostBack;
        box.CheckedChanged += new EventHandler(this.OnCheckChanged);
        container.Controls.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">The raiser of this event a CheckBox.</param>
    /// <param name="e">A System.EventArgs that contains the event data.</param>
    private void OnCheckChanged(object sender, EventArgs e) 
    {
        if (CheckedChanged != null) 
        {
            CheckedChanged(sender, e);
        }
    }
    //  private void OnCheckChanged(object sender, EventArgs e)
    //{
    //  CheckBox box = (CheckBox) sender;
    //DataGridItem container = (DataGridItem) box.NamingContainer;

    //  sqlUpdateCommand1.Parameters["@Object_id"].Value
    //     = int.Parse(container.Cells[0].Text);
    // sqlUpdateCommand1.Parameters["@Boolean"].Value = box.Checked;

    //         ...
    //
    //         }


    /// <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;
        }
    }

    private string val;
    public string Val 
    {
        get 
        {
            return val;
        }
        set 
        {
            val = value;
        }
    }


    /// <summary>
    /// The internal storage for the AutoPostback flag.
    /// </summary>
    private bool autoPostBack=false;

    /// <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">The raiser of the event.</param>
    /// <param name="e">A System.EventArgs that contains the event data.</param>
    private void BindData(object sender, EventArgs e) 
    {
        CheckBox box = (CheckBox) sender;
        DataGridItem container = (DataGridItem) box.NamingContainer;
        box.Checked = false;
        box.Enabled = (readOnly == true) ? false:true;
        string data = ((DataRowView) container.DataItem)[dataField].ToString();
        Type t = ((DataRowView)container.DataItem).DataView.Table.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;
}

public class CheckBoxColumn:System.Web.UI.WebControls.TemplateColumn 
{
    /// <summary>
    /// Initialise our CheckBoxColumn.
    /// </summary>
    public CheckBoxColumn() 
    {
        // set the view one as readonly
        viewItem = new CheckBoxItem(false); // SAW was false
        this.ItemTemplate = viewItem as ITemplate;

        // let the edit check box be editable
        editItem = new CheckBoxItem(true);
        this.EditItemTemplate = editItem as ITemplate;
    }

    /// <summary>
    /// Initialise our CheckBoxColumn with an optional ImmediatePostback capability.
    /// </summary>
    /// <param name="ImmediatePostback">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 ImmediatePostback) 
    {
        // set the view one as readonly
        viewItem = new CheckBoxItem(ImmediatePostback);
        this.ItemTemplate = viewItem as ITemplate;

        // let the edit check box be editable
        editItem = new CheckBoxItem(true);
        this.EditItemTemplate = editItem as ITemplate;

        AutoPostBack = ImmediatePostback;
    }

    /// <summary>
    /// Occurs when the value of the Checked property changes between posts to the server. 
    /// </summary>
    /// <remarks>
    /// The <b>CheckedChanged</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>CheckedChanged</b> event to work correctly.
    /// </remarks>
    public event EventHandler CheckedChanged 
    {
        add 
        {
            viewItem.CheckedChanged += value;
            editItem.CheckedChanged += value;
        }
        remove 
        {
            viewItem.CheckedChanged -= value;
            editItem.CheckedChanged -= 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.AutoPostBack = value;
            editItem.AutoPostBack = value;
        }
        get 
        {
            return viewItem.AutoPostBack;
        }
    }

    /// <summary>
    /// The DataField that we wish our control to bind to.
    /// </summary>
    public string DataField 
    {
        get 
        {
            return viewItem.DataField;
        }
        set 
        {
            viewItem.DataField = value;
            editItem.DataField = 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;
}

Before I this checkbox column/item code, I simply had 2 columns in my datagrid, one column was the "select" in which the client would click, and I used btnSelect_Clicked (able to create in my html-generated code) as my handler, and the other was an "active" column which changed everytime I clicked the respective dataGrid row (grid.SelectedIndex). Now since I changed my code to incorporate the checkbox column, I can't seem to extract the necessary "true/false" data. Maybe it is within the OncheckedChanged function?? I cannot for the life of me figure out how to retrieve some sort of variable to check if the box is checked (true) or unchecked (false). I see box.Checked... but that is not accessible when accessing the actual datagrid. Maybe it would be better for me if you can answer the question: can you specifically pull the checkbox data with a certain cell in the datagrid and use that certain variable to check if it is true/false?? I tried something like

if(dataTbl.Rows[grdResults.SelectedIndex]["Boolean"].ToString() == "true")
{currentCustomer.CustomerDiscounts[grdResults.SelectedIndex].ActiveFlag = true;
else
{currentCustomer.CustomerDiscounts[grdResults.SelectedIndex].ActiveFlag = false;

(I'm trying to set my ActiveFlag field in respect to the respective CheckBox field that is changed)

Thanks in advance!!

Edited 3 Years Ago by Dani: Formatting fixed

I would try not to use ToString() instead used:

dataTbl.Rows[grdResults.SelectedIndex]["Boolean"].Checked == true

More broken down it looks like:

DataRow dr = dataTbl.Rows[grdResults.SelectedIndex];
bool yesNo = dr["boolean"].Checked; // this assumes that "boolean" is the name of the column
if(yesNo)
doStuff();
else
doOtherSTuff();

Hope this helps, haven't tried it yet though.

This article has been dead for over six months. Start a new discussion instead.