![]() |
| ||
| Adding a checkbox column dynamically 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!! |
| ||
| Re: Adding a checkbox column dynamically I would try not to use ToString() instead used: dataTbl.Rows[grdResults.SelectedIndex]["Boolean"].Checked == trueMore broken down it looks like: DataRow dr = dataTbl.Rows[grdResults.SelectedIndex]; Hope this helps, haven't tried it yet though. |
| All times are GMT -4. The time now is 2:06 am. |
Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC