2016-08-12 59 views
1

因此,虽然与WebForm混淆,我试图创建一个页面,从一个SQL服务器输出表到Page_Load上的HTML表。然后我尝试将一个按钮添加到将重定向到一个页面的列。唯一的问题是,当我按下按钮时根本没有任何反应......我尝试在onclick方法中放置断点,但它们从未到达。动态创建按钮拒绝调用它的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> 

回答

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; 
} 
+0

因此,我可以理解,所以我可以理解你在说什么,只有在“编译时”(我不知道web dev dev equivalent)或通过asp.net添加时才能识别控件。因此,向HTML文档注入任何内容都无法与asp.net通信? – Javant

+0

@Javant是的,你是对的。你不能像这样使用服务器端代码。 –

+0

@Javant只是提到你可以用这种方式使用Javascript代码,因为它可以在客户端运行。但他们的任务完全不同 –

0

您不添加corectl按钮的网页表单。试试这种方式:

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

也如this question所示。

+0

你的按钮只是使按钮(一个或多个)消失 – Javant

+0

@Javant之前从来没有发生在我身上,让我检查。你确定它是一个asp.net webforms项目吗? – meJustAndrew

1

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

因此,当您回发到服务器时,它不知道在您单击时需要在服务器端执行任何操作。

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

得到它出现在你的桌子中间可能需要你做一些其他的方式你的HTML表的创建,如建立器WebControls Table对象,并添加Controls集合。