【问题标题】:Adding ASP.Net Controls Dynamically动态添加 ASP.Net 控件
【发布时间】:2016-11-25 15:47:45
【问题描述】:

我有一个存储过程,它根据存储在数据库中的记录数返回许多行,现在我想有一种方法来创建一个 <div> 标记,其中包含包含该行值的控件,如果从数据库返回 10 行,则必须创建 10 个<div> 标签,我有下面的代码从数据库中获取结果,但我不知道如何从这里继续。 p>

            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();
            }      

更新:我正在使用网络表单来做到这一点

【问题讨论】:

标签: c# asp.net


【解决方案1】:

你有几个选择。

备选方案 1。在你的 aspx 中添加一个PlaceHolder,并用你想要的内容填充它。

<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。在您的 aspx 中使用 Repeater

<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();
}      

【讨论】:

    【解决方案2】:

    由于您使用的是ASP.NET WebForms,我建议您使用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);
        }
    

    【讨论】:

      【解决方案3】:

      您可以使用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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 2010-11-04
        • 1970-01-01
        相关资源
        最近更新 更多