0

我正在尝试通过<asp:Button>点击事件调用在代码中创建的函数,但它不起作用......

protected void Page_Load(object sender, EventArgs e)
{       
            SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["Con"].ToString());
            ArrayList myArrayList = ConvertDataSetToArrayList();
            Literal objliteral = new Literal();
            StringBuilder objSBuilder = new StringBuilder();

        // Display each item of ArrayList
        foreach (Object row in myArrayList)
        {
            objSBuilder.Append("<div class='AppItem'>");                
            objSBuilder.Append("<label class='control-label span3'>" + ((DataRow)row)["PlanName"].ToString() + "</label>");
            objSBuilder.Append("<label class='control-label span3'> Plan Description :" + ((DataRow)row)["PlanDesc"].ToString() + "</label>");
            objSBuilder.Append("<label class='control-label span3'> Price :" + ((DataRow)row)["PlanCost"].ToString() + "</label>");
            objSBuilder.Append("<label class='control-label span3'> Total Visitors :" + ((DataRow)row)["PlanVisitors"].ToString() + "</label>");
            objSBuilder.Append("<div class='control-group'><asp:Button Text='AddtoCart' runat='server' id='" + ((DataRow)row)["PlanId"].ToString() + "' class='btn btn-small btn-success' onclick='AddPlanToCart();' /></div>");

            //<asp:Button ID="ImageButton1" runat="server" Text="Upload" CssClass="btn btn-small btn-success" onclick="ImageButton1_Click" />
            objSBuilder.Append("</div>");
        }
        objliteral.Text = objSBuilder.ToString();
        PlanContent.Controls.Add(objliteral);
}

private void AddPlanToCart()
{    
        //This does not get called.
}

点击这里查看后面的代码!

4

3 回答 3

0

这里的问题是您正在生成要在客户端运行的代码,但包括旨在通过 asp.net 处理器运行的脚本和标签:

objSBuilder.Append("<div class='control-group'><asp:Button Text='AddtoCart' runat='server' id='" + ((DataRow)row)["PlanId"].ToString() + "' class='btn btn-small btn-success' onclick='AddPlanToCart();' /></div>");

它产生的 HTML 包括 [稍微重新格式化]:

<div class='control-group'>
    <asp:Button ... onclick='AddPlanToCart();' />
</div>

而不是<button>您显然期望的控制。

修复它以按照其写入的方式工作将是大量的工作。相反,我强烈建议重写它以使用<asp:repeater>控件。

于 2013-07-18T13:38:45.887 回答
0

您的 onclick 正在尝试调用 javascript 函数AddPlanToCart()。你有几个选择。这是2:

1) 创建一个使用特定查询字符串进行回发的 javascript。检查 page_load 中的查询字符串,如果存在则调用该函数。

2) 创建一个实际的动态控件。如果要跟踪它的视图状态,而不是 Page_load,它应该在 Page_init 中创建。 然后为按钮添加一个事件处理程序

Button b2 = new Button();
b2.Text = "Add To Cart";
b2.Click += new EventHandler(AddPlanToCart);
于 2013-07-18T13:43:11.163 回答
0

创建按钮时,您还可以将单击事件绑定到委托,如下所示:

Button btn = new Button();
btn.Text = "Button text";
btn.AutoSize = true;
btn.Location = new Point(y, 0);
btn.Click += delegate(object sender, EventArgs e)
{
    solution.Invoke(); 
}; 

在这种情况下,我将Action<>, 作为方法中的参数传递。当您单击按钮时,将触发委托。例如,将创建此按钮,单击时会显示一个消息框:

Button btn = new Button();
btn.Text = "Button text";
btn.AutoSize = true;
btn.Location = new Point(y, 0);
btn.Click += delegate(object sender, EventArgs e)
{
    MessageBox.Show("Clicked!");
}; 

对于您的方案,请尝试以下几行:

int counter = 0;

// Display each item of ArrayList
foreach (Object row in myArrayList)
{
    Control ctrl = new Control();

    Label lbl = new Label();
    lbl.Text = "Label " + counter.ToString();

    Button btn = new Button();
    btn.Text = "Button text " + counter.ToString(); 
    btn.Click += delegate(object sender, EventArgs e)
    {
        Response.Write("<script>alert('Message for button " + counter.ToString() + "');</script>");
    }; 

    ctrl.Controls.Add(lbl);
    ctrl.Controls.Add(btn);

    counter++; 

    PlanContent.Controls.Add(ctrl);
}
于 2013-07-18T13:43:50.933 回答