我正在创建一个包含运行时链接按钮和单选按钮以及复选框列表的页面。在这种情况下,数据源是DataTable
,其中存在数据。
在页面加载时,我将RadioButton
文本部分与DataTable
的第一行绑定,并创建运行时链接按钮。现在在第二个链接按钮的Click
上,单选按钮文本属性与DataTable
的第二行绑定。
最初,与每个单选按钮关联的复选框列表处于非活动状态。我的主要动机是启用单选按钮CheckedChanged
属性上的复选框列表。但每当我点击单选按钮时,单选按钮和复选框列表的整个文本部分就会消失。但是在第一种情况下(在页面加载时)单击单选按钮时,与该对应的复选框列表已启用,但在任何其他情况下都没有。我的详细代码是:
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";
}
}
答案 0 :(得分:2)
每次点击按钮(或回发)时,Page_Load() fires before Click/Action event
。因此,您需要确保仅在页面未回发时才执行初始页面加载代码。您可以通过if(!Page.IsPostBack){}
查看来完成此操作。
我想这可能会解决你的问题。
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
}
}