【问题标题】:Dynamically Created Button refuses to call it's onClick动态创建的按钮拒绝称其为 onClick
【发布时间】:2016-08-12 19:12:34
【问题描述】:

所以在玩弄网络表单的同时,我尝试创建一个页面,该页面将一个表从 sql 服务器输出到 Page_Load 上的一个 html 表。然后,我尝试向将重定向到页面的列添加一个按钮。唯一的问题是,当我按下按钮时,什么也没有发生……我尝试在 onclick 方法处设置断点,但从未到达。

        num = ds.Tables[0].Rows.Count;
        htmlTable.Append("<tr style='background-color:#bd0000; color: White;'><th>ID</th><th>Job #</th><th>Project</th><th>Completed By</th><th>Date Created</th><th></th></tr>");

        if (!object.Equals(ds.Tables[0], null))
        {
            if (ds.Tables[0].Rows.Count > 0)              
            {
                int MAX_VIEW = (ds.Tables[0].Rows.Count > 15) ? 15 : ds.Tables[0].Rows.Count;
                for (int i = 0; i < MAX_VIEW; i++)
                {
                    htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "</td>");
                    htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Job_Number"] + "</td>");
                    htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Project_Name"] + "</td>");
                    htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["CompletedBy"] + "</td>");
                    htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["DateCreated"] + "</td>");
                    htmlTable.Append("<td width=\"10%\"><button class=\"astext\" name=\"Btn" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "\" id =\"" + ds.Tables[0].Rows[i]["CCPOF_ID"] + "\" OnClick =\"btnEdit_Click\" runat=\"server\" >Edit</button> | Details</td>");
                    htmlTable.Append("</tr>");
                }
                htmlTable.Append("</table>");
                DBDataPlaceHolder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = htmlTable.ToString() });
            }
            else
            {
                htmlTable.Append("<tr>");
                htmlTable.Append("<td align='center' colspan='4'>There is no Record.</td>");
                htmlTable.Append("</tr>");
            }
        }
    }

    protected void btnEdit_Click(object sender, EventArgs e)
    {
        String id = ((System.Web.UI.WebControls.Button)sender).ID;
        Server.Transfer("CcpofDetails.aspx?ID=" + id);
    }
}

当我检查实时表单中的按钮时,这就是我所看到的

<button class="astext" name="Btn10" id="10" onclick="btnEdit_Click" runat="server">Edit</button>

【问题讨论】:

    标签: c# asp.net asp.net-mvc server-side


    【解决方案1】:

    您生成动态控件的方式对我来说似乎很奇怪。这不是网络表单的工作方式。

    要在控件上运行事件,必须先将其加载到服务器内存中。但是您只是在填充一些仅对浏览器可以理解的 html 文本,而不是 asp.net 引擎。

    看看this sample

    为了给你一个更好的主意,像这样创建你的按钮

    private void Page_Load(object sender, System.EventArgs e)
    {
        if (!IsPostBack)
            AddControls();
    }
    
    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        if (ViewState["controsladded"] == null)
        AddControls();
    }
    
    private void AddControls()
    {
        TextBox dynamictextbox = new TextBox();
        dynamictextbox.Text = "(Enter some text)";
        dynamictextbox.ID = "dynamictextbox";
        Button dynamicbutton = new Button();
        dynamicbutton.Click += new System.EventHandler(dynamicbutton_Click);
        dynamicbutton.Text = "Dynamic Button";
        Panel1.Controls.Add(dynamictextbox);
        Panel1.Controls.Add(new LiteralControl("<BR>"));
        Panel1.Controls.Add(new LiteralControl("<BR>"));
        Panel1.Controls.Add(dynamicbutton);
        ViewState["controlsadded"] = true;
    }
    
    private void dynamicbutton_Click(Object sender, System.EventArgs e)
    {
        TextBox tb = new TextBox();
        tb = (TextBox) (Panel1.FindControl("dynamictextbox"));
        Label1.Text = tb.Text;
    }
    

    【讨论】:

    • 所以就我可以理解的术语来说,我可以理解你在说什么,只有在“编译时”创建控件时才会识别控件(我不知道网络开发等价)或通过 asp.net 添加。因此向 html doc 中注入任何内容都无法与 asp.net 通信?
    • @Javant 是的,你是对的。你不能使用这样的服务器端代码。
    • @Javant 只是提到您可以通过这种方式使用 Javascript 代码,因为它将在客户端运行。但他们的任务完全不同
    【解决方案2】:

    我相信您的问题来自 ASP.NET 不知道您创建了一个按钮这一事实。就它而言,您所做的只是在页面上输出一些文本。

    结果,当你回发到服务器时,它不知道你点击时它需要在服务器端做任何事情。

    尝试将其创建为对象(System.Web.UI.WebControls.Button)并将其添加到页面的 Controls 集合中。请注意,您必须在初始页面构建和回发时都执行此操作:如果在回发后控件不存在,则与其关联的事件不会触发。

    让它出现在表格中间可能需要您以其他方式创建 HTML 表格,例如构建 WebControls Table 对象并将 that 添加到您的 @987654324 @收藏。

    【讨论】:

      【解决方案3】:

      您没有将 corectl 按钮添加到 Web 表单。试试这个方法:

      Button btnEdit = New Button();
      btn.Edit.Click += btnEdit_Click;
      frmMain.Controls.Add(btnSave)
      

      也如this question所示。

      【讨论】:

      • 只是让按钮消失
      • @Javant 以前从未发生在我身上,让我检查一下。你确定这是一个 asp.net webforms 项目吗?
      猜你喜欢
      • 2016-06-29
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多