2013-04-01 147 views
0

我觉得这个问题已经被问过很多次了(我自我问过一次),但有一个新问题,我面临着。我创建了一个按钮数组按钮另一个按钮在我的应用程序。创建按钮的数量将取决于我从数据库中获得的值和我从数据库中获得的值取决于会话值,我通过查询。我的代码如下所示。按钮点击事件阵列的按钮不发射

代码

protected void attributes() 
    { 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ToString()); 
    SqlCommand cmd = new SqlCommand("select attributesequenceNumber as attsno,ProductCode as pcode, P26 as '" + 26 + "',P28 as '" + 28 + "',P30 as '" + 30 + "',P32 as '" + 32 + "',P34 as '"+34+"',P36 as '"+36+"',P38 as '"+38+"',P40 as '"+40+"',P42 as '"+42+"',SHXS as XS,SHS as S,SHM as M,SHL as L,SHXL as XL,SHXXL as XXL from tblattribute where ProductCode='" + Session["ImgProdCode"] + "'", con); 
    //SqlCommand cmd = new SqlCommand("select Col.value('local-name(.)', 'varchar(Max)') as ColName from (select * from tblattribute where ProductCode ='"+Session["ImgProdCode"]+"' for xml path(''), type) as T(XMLCol) cross apply T.XMLCol.nodes('*') as n(Col) where Col.value('.', 'varchar(1)') = 1 " , con); 
    try 
    { 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     DataTable dtble = new DataTable(); 
     SqlDataAdapter dap = new SqlDataAdapter(cmd); 
     dap.Fill(dtble); 
     if (dtble.Rows.Count > 0) 
     { 
      result = dtble.Columns.Cast<DataColumn>() 
     .Where(c => c.ColumnName != "pcode" && c.ColumnName != "attsno") 
     .Where(c => dtble.Rows[0][c].ToString() == "1") 
     .Select(c => c.ColumnName) 
     .ToList(); 
      res = result.Count; 
      lbl = new Button[res]; 
      for(i=0; i<result.Count; i++) 
      { 

       lbl[i] = new Button(); 
       lbl[i].Text = result[i]; 
       lbl[i].ID = "btn" + i.ToString(); 
       lbl[i].Width = 30; 
       lbl[i].Click+=new EventHandler(lbl_click); 
       lbl[i].CssClass = "label"; 
       div1.Controls.Add(lbl[i]); 
      } 

     } 

    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     if (con != null) 
     { 
      con.Close(); 
     } 
    } 

} 

protected void lbl_click(object sender, EventArgs e) 
{ 

    Button lbl = sender as Button; 
    lbl.CssClass = "label1"; 

} 

上述方法属性s()将在按钮点击时被调用,并且会话值也将在buttonclick上生成。在研究中我发现动态按钮的创建应该在page_init事件中完成,但我无法在这里完成。请帮助解决这个问题..

+0

你能发布lbl_click()....吗? – Sunil

+0

@Sunil我已经更新了我的问题。请检查它。 – coder

回答

1

看看这里。

http://blog.krisvandermast.com/AddingADynamicControlToAPlaceholderControlAndWireUpTheEvent.aspx

事件是有你只需要再次连线起来。

+0

我无法在page_load或page_init中调用我的方法。 – coder

+0

我没有说你可以。看看这里,也许更清楚一点:http://forums.asp.net/t/1589408.aspx/1 – Marco

+0

我也检查了该链接和其他一些链接,我知道应该在preInit中创建或重新创建动态控件事件的页面生命周期。但我不能这样做我的应用程序。我想在页面生命周期的控制事件中动态地创建控件。任何想法? – coder

0

你可以通过使用jQuery来实现。
将jQuery引用添加到网页
获取所有适合class'label'的控件,在其click事件中调用服务器端'lbl_click'方法。
确保'lbl_click'方法应该被标记为静态,并用[webmethod]进行修饰。

ASPX页面

<script src="http://code.jquery.com/jquery-1.9.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
//Find all controls that belongs to class '.label' 
//on its click event call the server side function. 
    $(".label").click(function(e) { 
    $.ajax({ 
     type: "POST", 
     url: "Default.aspx/lbl_click", 
     data: "{}", //can pass parameter here, if required 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     error: 
     function(XMLHttpRequest, textStatus, errorThrown) { 
     //Handle error here. 
     }, 
     success: 
     function(result) { 
     //Set button css class to 'label1' using jQuery. 
     } 
    }); 
    }); 
}); 
</script> 
</head> 


代码隐藏

protected void attributes() 
    { 
    SqlConnection con = new 

SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ToString()); 
    SqlCommand cmd = new SqlCommand("select attributesequenceNumber as attsno,ProductCode as pcode, P26 as '" + 26 + "',P28 as '" + 28 + "',P30 as '" + 30 + "',P32 as '" + 32 + "',P34 as '" + 34 + "',P36 as '" + 36 + "',P38 as '" + 38 + "',P40 as '" + 40 + "',P42 as '" + 42 + "',SHXS as XS,SHS as S,SHM as M,SHL as L,SHXL as XL,SHXXL as XXL from tblattribute where ProductCode='" + Session["ImgProdCode"] + "'", con); 
    //SqlCommand cmd = new SqlCommand("select Col.value('local-name(.)', 'varchar(Max)') as ColName from (select * from tblattribute where ProductCode ='"+Session["ImgProdCode"]+"' for xml path(''), type) as T(XMLCol) cross apply T.XMLCol.nodes('*') as n(Col) where Col.value('.', 'varchar(1)') = 1 " , con); 
try 
{ 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    DataTable dtble = new DataTable(); 
    SqlDataAdapter dap = new SqlDataAdapter(cmd); 
    dap.Fill(dtble); 
    if (dtble.Rows.Count > 0) 
    { 
    result = dtble.Columns.Cast<DataColumn>() 
.Where(c => c.ColumnName != "pcode" && c.ColumnName != "attsno") 
.Where(c => dtble.Rows[0][c].ToString() == "1") 
.Select(c => c.ColumnName) 
.ToList(); 
    res = result.Count; 
    lbl = new Button[res]; 
    for (i = 0; i < result.Count; i++) 
    { 

     lbl[i] = new Button(); 
     lbl[i].Text = result[i]; 
     lbl[i].ID = "btn" + i.ToString(); 
     lbl[i].Width = 30; 
     //lbl[i].Click += new EventHandler(lbl_click); 
     lbl[i].CssClass = "label"; 
     div1.Controls.Add(lbl[i]); 
    } 

    } 

} 
catch 
{ 
    throw; 
} 
    finally 
    { 
     if (con != null) 
     { 
     con.Close(); 
     } 
    } 
    } 



    [WebMethod] 
    public static string lbl_click() 
    { 
    return "label1"; 
    } 

希望这会帮助你。

+0

如何访问使用jQuery的动态数组控件? – coder

+1

为所有控件的动态数组分配一个通用的css类(如代码中的''label')。然后在jQuery中使用这个类名访问这些控件。 – Sunil