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(" 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;
}
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(" 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;
}