943,691 Members | Top Members by Rank

Ad:
  • C# Discussion Thread
  • Unsolved
  • Views: 53317
  • C# RSS
Jul 27th, 2004
0

Adding a checkbox column dynamically

Expand Post »
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 CheckBoxColumnystem.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!!
Reputation Points: 10
Solved Threads: 0
Newbie Poster
recinto is offline Offline
1 posts
since Jul 2004
Aug 3rd, 2004
0

Re: Adding a checkbox column dynamically

I would try not to use ToString() instead used:
C# Syntax (Toggle Plain Text)
  1. dataTbl.Rows[grdResults.SelectedIndex]["Boolean"].Checked == true
More broken down it looks like:
C# Syntax (Toggle Plain Text)
  1. DataRow dr = dataTbl.Rows[grdResults.SelectedIndex];
  2. bool yesNo = dr["boolean"].Checked; // this assumes that "boolean" is the name of the column
  3. if(yesNo)
  4. doStuff();
  5. else
  6. doOtherSTuff();

Hope this helps, haven't tried it yet though.
Reputation Points: 46
Solved Threads: 2
Junior Poster
Iron_Cross is offline Offline
117 posts
since Jul 2003

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in C# Forum Timeline: dot net supports for mac amchines
Next Thread in C# Forum Timeline: Putting skins for my windows project





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC