UpdatePanel and RecreateChildControls


J

jeljeljel

I have a CompositeControl (called SimplePager) that creates an
UpdatePanel in its CreateChildControls override. The CompositeControl
uses two LinkButtons to control the forward/backward state. W/out the
use of the UpdatePanel it works just great. However, as a learning
exercise I want to AJAXify the control. I am placing the entire
control in an UpdatePanel. During the link click event handler, I
make a call to RecreateChildControls() which throws an exception.

This is so close to working. Can someone suggest how to accomplish
what I am trying to do with an UpdatePanel?

My class is copied below.

Thanks,
John


public class SimplePager : CompositeControl
{
private int _currentRecord;
private int _totalRecords;

public SimplePager(int totalRecords)
{
_totalRecords = totalRecords;
_currentRecord = 1;
}

protected override void OnInit(EventArgs e)
{
Page.RegisterRequiresControlState(this);

EnsureChildControls();

base.OnInit(e);
}

protected override void LoadControlState(object savedState)
{
int[] state;

state = (int[])savedState;

_currentRecord = state[0];
_totalRecords = state[1];
}

protected override object SaveControlState()
{
int[] state;

state = new int[] { _currentRecord, _totalRecords };

return state;
}

protected override void CreateChildControls()
{
HtmlGenericControl div;
LinkButton linkButton;
UpdatePanel updatePanel;
Label label;

div = new HtmlGenericControl("div");
Controls.Add(div);

updatePanel = new UpdatePanel();
updatePanel.ID = this.ID + "BWPagerUpdatePanel";
updatePanel.ChildrenAsTriggers = true;
updatePanel.UpdateMode =
UpdatePanelUpdateMode.Conditional;
div.Controls.Add(updatePanel);

linkButton = new LinkButton();
linkButton.Text = "<< prev";
linkButton.ID = "prevPage";
linkButton.Click += new EventHandler(linkButton_Click);

updatePanel.ContentTemplateContainer.Controls.Add(linkButton);

linkButton = new LinkButton();
linkButton.Text = "next >>";
linkButton.ID = "nextPage";
linkButton.Click += new EventHandler(linkButton_Click);

updatePanel.ContentTemplateContainer.Controls.Add(linkButton);

label = new Label();
label.ID = "SimplePagerTextBox";
label.Text = String.Format("&nbsp;&nbsp;Page {0} of {1}",
_currentRecord, _totalRecords);
updatePanel.ContentTemplateContainer.Controls.Add(label);

base.CreateChildControls();
}

private void linkButton_Click(object sender, EventArgs e)
{
LinkButton linkButton = sender as LinkButton;

if (PageChange != null)
{
switch (linkButton.ID)
{
case "prevPage":
if (_currentRecord > 1)
_currentRecord--;
break;

case "nextPage":
if (_currentRecord < _totalRecords)
_currentRecord++;
break;
}

PageChange(this, _currentRecord);

RecreateChildControls();
}
}

public int CurrentRecord
{
get
{
return _currentRecord;
}
}

public delegate void PageChangeEvent(object sender, int
newPage);
public event PageChangeEvent PageChange;
}
 
Ad

Advertisements

P

Phil H

Dear jeljeljel

You make a call to RecreateChildControls() but no such method exists
in the code you present.

It's difficult to diagnose why a method is raising an exception if its
code is not shown. Or could that be the cause of the problem?


I have a CompositeControl (called SimplePager) that creates an
UpdatePanel in its CreateChildControls override. The CompositeControl
uses two LinkButtons to control the forward/backward state. W/out the
use of the UpdatePanel it works just great. However, as a learning
exercise I want to AJAXify the control. I am placing the entire
control in an UpdatePanel. During the link click event handler, I
make a call to RecreateChildControls() which throws an exception.

This is so close to working. Can someone suggest how to accomplish
what I am trying to do with an UpdatePanel?

My class is copied below.

Thanks,
John

public class SimplePager : CompositeControl
{
private int _currentRecord;
private int _totalRecords;

public SimplePager(int totalRecords)
{
_totalRecords = totalRecords;
_currentRecord = 1;
}

protected override void OnInit(EventArgs e)
{
Page.RegisterRequiresControlState(this);

EnsureChildControls();

base.OnInit(e);
}

protected override void LoadControlState(object savedState)
{
int[] state;

state = (int[])savedState;

_currentRecord = state[0];
_totalRecords = state[1];
}

protected override object SaveControlState()
{
int[] state;

state = new int[] { _currentRecord, _totalRecords };

return state;
}

protected override void CreateChildControls()
{
HtmlGenericControl div;
LinkButton linkButton;
UpdatePanel updatePanel;
Label label;

div = new HtmlGenericControl("div");
Controls.Add(div);

updatePanel = new UpdatePanel();
updatePanel.ID = this.ID + "BWPagerUpdatePanel";
updatePanel.ChildrenAsTriggers = true;
updatePanel.UpdateMode =
UpdatePanelUpdateMode.Conditional;
div.Controls.Add(updatePanel);

linkButton = new LinkButton();
linkButton.Text = "<< prev";
linkButton.ID = "prevPage";
linkButton.Click += new EventHandler(linkButton_Click);

updatePanel.ContentTemplateContainer.Controls.Add(linkButton);

linkButton = new LinkButton();
linkButton.Text = "next >>";
linkButton.ID = "nextPage";
linkButton.Click += new EventHandler(linkButton_Click);

updatePanel.ContentTemplateContainer.Controls.Add(linkButton);

label = new Label();
label.ID = "SimplePagerTextBox";
label.Text = String.Format("&nbsp;&nbsp;Page {0} of {1}",
_currentRecord, _totalRecords);
updatePanel.ContentTemplateContainer.Controls.Add(label);

base.CreateChildControls();
}

private void linkButton_Click(object sender, EventArgs e)
{
LinkButton linkButton = sender as LinkButton;

if (PageChange != null)
{
switch (linkButton.ID)
{
case "prevPage":
if (_currentRecord > 1)
_currentRecord--;
break;

case "nextPage":
if (_currentRecord < _totalRecords)
_currentRecord++;
break;
}

PageChange(this, _currentRecord);

RecreateChildControls();
}
}

public int CurrentRecord
{
get
{
return _currentRecord;
}
}

public delegate void PageChangeEvent(object sender, int
newPage);
public event PageChangeEvent PageChange;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top