DataGrid ButtonColumn/BoundColumn problem

  • Thread starter Thread starter John
  • Start date Start date
J

John

The ItemCommand event not getting fired when I add both a BoundColumn and a
ButtonColumn to a datagrid. When I add a ButtonColumn by itself, everything
works fine, but as soon as I add a BoundColumn, the ItemCommand event
doesn't seem to get called.

I've been struggling with this for too long now, I'm certain there's
something I'm not getting. Here's the relevant code. Thanks in advance!

// As is, this code does not correctly call the ItemCommand event handler.
// Comment out AddIDColumn however and the ItemCommand event handler
// is called when expected.
private void Page_Load(object sender, System.EventArgs e) {
AddIDColumn();
AddButtonColumn();
dg.DataSource = GetDataSource();
dg.DataKeyField = "employeeid";
if ( !IsPostBack )
dg.DataBind();
}

private void AddIDColumn() {
BoundColumn bound = new BoundColumn();
bound.DataField = "EmployeeID";
bound.HeaderText = "EmployeeID";
dg.Columns.Add( bound );
}

private void AddButtonColumn() {
ButtonColumn button = new ButtonColumn();
button.ButtonType = ButtonColumnType.LinkButton;
button.Text = "Click Me";
button.CommandName = "whatever";
dg.Columns.Add( button );
}

private void dg_ItemCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e) {
dg.DataBind();
}
 
Hi

If you add some column at runtime, these have to be loaded at the
initialization of the page (OnInit method) not in Page_load otherwise the
page doesn't succeed to load the relative viewstate.

If you move AddIDColumn(); and AddButtonColumn();
into the OnInit method your example it will work

Ciao
Giorgio
 
Thanks for your response, you're right this does work. But this brings upon
more questions! Why do these need to be set in the Init exactly? Also, I
want to allow the user to show or hide the ButtonColumn, so I store a flag
in the ViewState to control this. I believe the ViewState is only loaded
after Init is called. How can I decide to show or hide the ButtonColumn
then? What's the solution to this problem?
 
Hi
Why do these need to be set in the Init exactly? Also, I
want to allow the user to show or hide the ButtonColumn, so I store a flag
in the ViewState to control this. I believe the ViewState is only loaded
after Init is called. How can I decide to show or hide the ButtonColumn
then? What's the solution to this problem?

Asp.NET has a well defined Control Life Cycle
(http://www.15seconds.com/issue/020102.htm)
so new controls added at runtime at the control collection must be added in
the OnInit.
but it is enough that is initialized in the OnInit! you can modify it in
other methods (for example in the Page_Load)
For your problem you can:
1 - Add the datagrdi column on the OnInit
2 - Hide the column in the Page_load event: datagrid.Columns[0].Visible =
false.

Ciao
Giorgio
 
Back
Top