2013-04-01 82 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