Reputation: 25
I am creating a page with runtime link buttons and radio buttons and checkbox list as well. The Data Source in this case is a DataTable
in which the data is present.
On page load, I bind the RadioButton
text part with the first row of the DataTable
and run time link buttons are created along with it. Now on Click
of second link button, radio button text property is bind with the second row of DataTable
.
Initially, the checkbox list associated with each radiobutton is inactive. My main motive is to enable the checkbox list on radio button CheckedChanged
property. But whenever I click on the radiobuttons the whole text part of radio button and checkboxlist disappears. But in first case (on page load) when the radio button is clicked, the checkbox list corresponding to that is enabled but not in any other case. My detailed code is:
protected void Page_Load(object sender, EventArgs e)
{
string Query = "select Q101004,Q101005 from Q101 where Q101001<110000013";
DataTable dt = ExecuteDataset(Query).Tables[0];
ViewState["dt"] = dt;
Table t = new Table();
TableRow r = new TableRow();
t.Rows.Add(r);
TableCell c = new TableCell();
lnkbtn = new LinkButton();
r.Cells.Add(c);
rb = new RadioButton();
rb.AutoPostBack = true;
rb.ID = "m";
rb.GroupName = "a";
rb.Text = dt.Rows[0][0].ToString();
CbxList = new CheckBoxList();
CbxList.ID = "Cbx";
CbxList.Enabled = false;
CbxList.RepeatDirection = RepeatDirection.Horizontal;
CbxList.RepeatColumns = 2;
CbxList.CellPadding = 10;
CbxList.CellSpacing = 5;
CbxList.RepeatLayout = RepeatLayout.Table;
options = dt.Rows[0][1].ToString().Split('~');
PlaceHolder2.Controls.Add(new LiteralControl("<br/>"));
for (int j = 0; j < options.Length; j++)
{
CbxList.Items.Add(new ListItem(options[j], options[j]));
}
PlaceHolder2.Controls.Add(rb);
PlaceHolder2.Controls.Add(CbxList);
for (int i = 0; i < dt.Rows.Count; i++)
{
lnkbtn = new LinkButton();
lnkbtn.Text = (i + 1).ToString();
lnkbtn.Width = 22;
lnkbtn.Visible = true;
lnkbtn.CommandName = "Test" + i;
lnkbtn.CommandArgument = "Hi" + i;
lnkbtn.ID = "Hi" + i;
PlaceHolder2.Controls.Add(lnkbtn);
lnkbtn.Click += new EventHandler(lnkbtn_Click);
}
rb.CheckedChanged += new EventHandler(rb_CheckedChanged);
}
void lnkbtn_Click(object sender, EventArgs e)
{
DataTable dt = (DataTable)ViewState["dt"];
for (int j = 1; j < dt.Rows.Count; j++)
{
lnkbtn = (LinkButton)PlaceHolder2.FindControl("Hi"+j);
string str = ((LinkButton)sender).CommandArgument;
//lnkbtn.Enabled = true;
if (lnkbtn.ID == str)
{
rb = new RadioButton();
rb.AutoPostBack = true;
rb.ID = "m"+j;
rb.GroupName = "a";
rb.Text = dt.Rows[j][0].ToString();
CbxList = new CheckBoxList();
CbxList.ID = "Cbx"+j;
CbxList.Enabled = false;
CbxList.RepeatDirection = RepeatDirection.Horizontal;
CbxList.RepeatColumns = 2;
CbxList.CellPadding = 10;
CbxList.CellSpacing = 5;
CbxList.RepeatLayout = RepeatLayout.Table;
options = dt.Rows[j][1].ToString().Split('~');
PlaceHolder2.Controls.Add(new LiteralControl("<br/>"));
for (int i = 0; i < options.Length; i++)
{
CbxList.Items.Add(new ListItem(options[i], options[i]));
}
PlaceHolder2.Controls.Add(rb);
PlaceHolder2.Controls.Add(CbxList);
}
}
}
void rb_CheckedChanged(object sender, EventArgs e)
{
Cbx = (RadioButton)PlaceHolder2.FindControl("m");
Cbx1 = (CheckBoxList)PlaceHolder2.FindControl("Cbx");
if (Cbx.Checked == true)
{
Cbx1.Enabled = true;
ViewState["Cbx1"] = "Cbx";
}
}
Upvotes: 0
Views: 327
Reputation: 33809
Every time you click the button (or posting back), Page_Load() fires before Click/Action event
. Therefore, you need to make sure that initial page loading code is executed only if page is not posting back. You can do that by checking with if(!Page.IsPostBack){}
.
I guess this might sort out your issue.
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack){
//your initial page load code should go here
//this code will not be executed when page is posting back
}
}
Upvotes: 2