【问题标题】:Dynamically build a table into a placeholder将表格动态构建成占位符
【发布时间】:2019-09-23 16:52:50
【问题描述】:

我正在尝试在用户点击按钮时动态构建表格。我想要做的是拥有它,以便它首先构建表格的标题。

我尝试执行此操作的代码如下。所以当用户点击创建表按钮时,这个方法就会运行:

        private void AddTableTitles()
    {
        Literal startRow = new Literal();
        startRow.Text = "<tr><th colspan=\"2\">";
        Literal Column = new Literal();
        Column.Text = "</th><th colspan=\"2\">";
        Literal endRow = new Literal();
        endRow.Text = "</th></tr>";

        AssignPlaceHolder.Controls.Add(startRow);
        AssignPlaceHolder.Controls.Add(AddSiteHeader());
        AssignPlaceHolder.Controls.Add(Column);
        AssignPlaceHolder.Controls.Add(AddMachNameHeader());
        AssignPlaceHolder.Controls.Add(Column);
        AssignPlaceHolder.Controls.Add(AddMachTypeHeader());
        AssignPlaceHolder.Controls.Add(Column);
        AssignPlaceHolder.Controls.Add(AddMachModelHeader());
        AssignPlaceHolder.Controls.Add(endRow);
    }

注意:AssignPlaceHolder 只是将给定的项目放入页面中。代码在这里:

        public PlaceHolder AssignPlaceHolders
    {
        get { return this.AssignPlaceHolder; }
    }

所以我想要得到的是这样的东西。

网站 |机器名称 |机器类型 |机器型号

然而,作为表头,这就是我最终得到的:

站点机器名称机器类型 |机器型号

注意:“|”表示您应该在表格中获得的列之间的拆分。

如您所见,它只会将其分成两列。我到底做错了什么,我该如何解决这个问题?

注意:我知道我可以对这部分进行硬编码,但是通过弄清楚如何让这部分以这种方式工作,我将能够解决我在表的动态部分遇到的问题送入其中的项目数量取决于存储在数据库中的机器数量,这些机器也发生了同样的事情。

更新1 根据要求

        private Label AddSiteHeader()
    {
        Label label = new Label();
        label.ForeColor = System.Drawing.Color.DarkBlue;
        label.Text = "Site ";
        return label;
    }

所有这些方法所做的就是创建一个标签并为其填充文本。

【问题讨论】:

  • @Jame213 使用带有硬编码 HTML 的 Literal 控件而不是使用像 HtmlTable 这样的内置 HTML 对象来构建适当的表格控件然后从 @ 渲染 HTML 的任何原因987654326@控制自己?您可能需要显示更多代码,例如 AddSiteHeader() 中发生的事情,我假设它只返回文本 Site。还有什么代码被添加来启动和关闭你的&lt;table&gt;?
  • @Kelsey 好吧,我正在尝试通过以前的开发人员在涉及动态表的其他页面上所做的工作来实现这一点,所以没有特别的理由说明我为什么要使用文字而不是我要离开以前的开发人员做了什么。但是,如果您认为使用 htmltable 代替文字会更好或更正确,那么我会试一试。
  • @Jame213 我建议使用Repeater,如下所示,只需将Repeater 以任何形式绑定到您的项目列表。
  • @Kelsey 中继器可以处理从网络服务上传的数据吗?
  • 你几乎可以将任何东西绑定到Repeater。即使是List&lt;SomeObject&gt; 也可以。我认为您应该研究 DataBinding 在 ASP.NET 中的工作原理,因为您缺少一些非常有用的功能,这些功能可能会在未来为您节省大量时间。

标签: c# asp.net html web-services


【解决方案1】:

Repeater 在这种情况下会更有用吗?

<asp:Repeater ID="yourTable" runat="server">
    <HeaderTemplate>
        <table>
            <tr>
                <th><%= AddSiteHeader() %></th>
                <th><%= AddMachTypeHeader() %></th>
                <th><%= AddMachModelHeader()%></th>
            </tr>
    </HeaderTemplate>
    <ItemTemplate>
            <tr>
                <td><%# Eval("Site") %></td>
                <td><%# Eval("MachType") %></td>
                <td><%# Eval("MachModel") %></td>
            </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

您可以将其绑定到您的数据源并为您节省大量工作,因为这就是您正在做的事情。如果您只需要 Repeater 的 HTML 输出,并且想要提供输出并将其推送到 div 或其他内容中,您可以预渲染它并使用 RenderControl 方法获取 HTML 输出。

似乎解决方案的工作原理是使用旧的 ASP 思维方式,而不是 ASP.NET 并利用它的优势。

【讨论】:

    【解决方案2】:

    好的,所以我使用以前的占位符解决了这个问题,所以我想我会发布它以防其他人有这个问题。

        private void AddTableTitles()
        {
            TableHeaderCell site  = new TableHeaderCell();
            TableHeaderCell name  = new TableHeaderCell();
            TableHeaderCell type  = new TableHeaderCell();
            TableHeaderCell model = new TableHeaderCell();
            TableHeaderRow  th    = new TableHeaderRow();
    
            site.Controls.Add(AddSiteHeader());            
            th.Controls.Add(site);
            //AssignPlaceHolder.Controls.Add(th);
    
            name.Controls.Add(AddMachNameHeader());            
            th.Controls.Add(name);
            //AssignPlaceHolder.Controls.Add(th);
    
            type.Controls.Add(AddMachTypeHeader());            
            th.Controls.Add(type);
            //AssignPlaceHolder.Controls.Add(th);
    
            model.Controls.Add(AddMachModelHeader());            
            th.Controls.Add(model);
    
            AssignPlaceHolder.Controls.Add(th);
        }
    

    它最终成为一个简单的问题,只需要为每列添加新的表格单元格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2014-04-08
      • 2015-03-27
      • 2017-08-21
      • 2012-10-21
      相关资源
      最近更新 更多