动态添加ASP.Net控件

动态添加ASP.Net控件

问题描述:

我有一个存储过程,根据存储在数据库中的记录数返回一些行,现在我想创建一个带有包含该行的值的控件的<div>标记,如果有10行从数据库返回,那么必须创建10 <div>标签,我有下面的代码来从数据库中获取结果,但我不知道如何从这里继续。动态添加ASP.Net控件

  String sql = "exec dbo.spLoadCandidates @NationalID, @PostID"; 
      SqlDataReader reader; 
      using (SqlCommand cmd = new SqlCommand(sql, conn)) 
      { 
       cmd.Parameters.AddWithValue("@NationalID",TextBox2.Text.Trim()); 
       cmd.Parameters.AddWithValue("@PostID,", DropDownList1.SelectedValue); 
       conn.Open(); 
       reader = cmd.ExecuteReader(); 
       while (reader.HasRows) 
       { 
        //Dynamic Data here 
       } 
       conn.Close(); 
      }  

更新:使用web表单由于您使用ASP.NET WebForms做到这一点

+0

您是否使用WebForms,MVC或其他? – davke

+0

正在使用网页表单... –

+0

看看''http://code.runnable.com/UjMj269qAWwQAAB3/asp-net-how-to-use-repeater – TryingToImprove

你有几种选择。

方案1。添加一个PlaceHolder到你的aspx,并填写你想要的内容。

<asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder> 

然后你就可以到这个PlaceHolder从后面的代码添加内容。

String sql = "exec dbo.spLoadCandidates @NationalID, @PostID"; 
SqlDataReader reader; 
using (SqlCommand cmd = new SqlCommand(sql, conn)) 
{ 
    cmd.Parameters.AddWithValue("@NationalID",TextBox2.Text.Trim()); 
    cmd.Parameters.AddWithValue("@PostID,", DropDownList1.SelectedValue); 
    conn.Open(); 
    reader = cmd.ExecuteReader(); 
    while (reader.HasRows) 
    { 
     // Create div. 
     var div = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");  
     createDiv.InnerHtml = "" // Fill with your content... 
     // Add to placeholder. 
     PlaceHolder1.Add(createDiv); 
    } 
    conn.Close(); 
}  

备选2。使用Repeater您的aspx。

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <div><%# Eval("Name") %></div> 
    </ItemTemplate> 
</asp:Repeater> 

背后代码:

// Some class to keep your info... 
public class MyModel 
{ 
    public string Name { get; set; } 
} 

并且代码:

String sql = "exec dbo.spLoadCandidates @NationalID, @PostID"; 
SqlDataReader reader; 
using (SqlCommand cmd = new SqlCommand(sql, conn)) 
{ 
    cmd.Parameters.AddWithValue("@NationalID",TextBox2.Text.Trim()); 
    cmd.Parameters.AddWithValue("@PostID,", DropDownList1.SelectedValue); 
    conn.Open(); 
    reader = cmd.ExecuteReader(); 
    var list = new List<MyModel>(); 
    while (reader.HasRows) 
    { 
     var model = new MyModel(); 
     model.Name = "foo"; // Fill with your content... 
     list.Add(model); 
    } 
    conn.Close(); 

    // Bind to repeater. 
    Repeater1.DataSource = list; 
    Repeater1.DataBind(); 
}  

上午,我建议你使用Repeater

,但如果你喜欢用代码来做到这一点,这里有一个解决方法:

// Sample data 
    var items = new string[] { "User1", "User2", "User3" }; 

    foreach (var item in items) 
    { 
     // Create a new div control for each item 
     // You can create any ASP.NET WebForms control as well, such ASP.Net Label or etc 
     System.Web.UI.HtmlControls.HtmlGenericControl divControl = 
     new System.Web.UI.HtmlControls.HtmlGenericControl("DIV") { 
      ID = item, 
      InnerHtml = item 
     }; 

     // Add control to the page 
     // You can also add control to a panel or any container control 
     Controls.Add(divControl); 
    } 

可以使用Repeater控件呈现任何自定义标记的项目的集合。你可以试试这个:

标记:

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <div> 
      <%# Eval('column1') %> 
      <%# Eval('column2') %> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 

后面的代码:你的SQL结果绑定到Repeater控件。

protected void Page_PreRender(object sender, EventArgs e) 
{       
    String sql = "exec dbo.spLoadCandidates @NationalID, @PostID"; 
    using (SqlCommand cmd = new SqlCommand(sql, conn)) 
    { 
     cmd.Parameters.AddWithValue("@NationalID",TextBox2.Text.Trim()); 
     cmd.Parameters.AddWithValue("@PostID,", DropDownList1.SelectedValue); 
     conn.Open(); 
     using(SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      Repeater1.DataSource = reader; 
      Repeater1.DataBind();     
     }; 
     conn.Close(); 
    } 
}