简体   繁体   English

按钮触发事件,按钮阵列未触发

[英]Button click event for array of buttons not firing

I think this question have been asked many times already(I my self asked once),But there is a new problem which i am facing.I am creating an array of buttons onclick of another button in my application.Number of buttons created will depend upon values which i get from database and values which i get from database depends on a session value which i pass in the query.My code is as below.. 我认为这个问题已经被问过很多次了(我自己问过一次),但是我面临着一个新问题。我在应用程序中的另一个按钮上单击时创建了一个按钮数组。创建的按钮数量取决于根据我从数据库中获取的值和我从数据库中获取的值取决于我在查询中传递的会话值。我的代码如下。

Code : 代码

   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";

}

The above method attributes() will be called on a button click,and the session value will also be generated on buttonclick.On research i came to know that the creation of dynamic buttons should be done in page_init event but i cannot do it here.Please help to solve this issue.. 上面的方法attribute()将在按钮单击时被调用,并且会话值也将在buttonclick上生成。在研究中,我知道应该在page_init事件中完成动态按钮的创建,但是我不能在这里进行。请帮助解决此问题。

Have a look here. 在这里看看。

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

The event is there you just need to wire it up again. 该事件在那里,您只需要重新连接即可。

You can achieve this by using jQuery. 您可以使用jQuery来实现。
Add a jQuery reference to the web page 向网页添加jQuery参考
Get all controls that fit in class 'label', on its click event call the server side 'lbl_click' method. 获取适合类'label'的所有控件,在其click事件上调用服务器端'lbl_click'方法。
Make sure that 'lbl_click' method should be marked as static and decorated with [webmethod]. 确保将“ lbl_click”方法标记为静态,并用[webmethod]装饰。

Aspx page 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>


Code Behind 背后的代码

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

Hope this will help you. 希望这会帮助你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM