2013-09-26 28 views
0

我正在创建一个包含运行时链接按钮和单选按钮以及复选框列表的页面。这种情况下的数据源是数据存在的DataTable已更改Radiobutton已更改创建问题

在页面加载时,我将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"; 
    } 
} 

回答

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 
    } 
}