C# 将表动态构建到占位符中

C# 将表动态构建到占位符中,c#,asp.net,html,web-services,C#,Asp.net,Html,Web Services,我试图在用户点击按钮时动态构建一个表。我试图做的是让它首先构建表的标题 我尝试这样做的代码如下。因此,当用户点击“创建表”按钮时,将运行此方法: private void AddTableTitles() { Literal startRow = new Literal(); startRow.Text = "<tr><th colspan=\"2\">"; Literal Column = new

我试图在用户点击按钮时动态构建一个表。我试图做的是让它首先构建表的标题

我尝试这样做的代码如下。因此,当用户点击“创建表”按钮时,将运行此方法:

        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);
    }
所以我想得到的是这样的东西

现场|机器名称|机器类型|机器型号

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

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

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

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

注意:我知道我可以硬编码这部分,但通过找出如何使这部分以这种方式工作,我将能够解决我的表的动态部分存在的问题,该部分的项目数量由数据库中存储的机器数量决定,数据库中也发生了同样的事情

更新1 按要求

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

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

在这种情况下,
中继器是否更有用

<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>

您可以将它绑定到您的数据源并为您节省大量的工作,因为这就是您正在做的事情。如果您只需要
转发器的HTML输出
,并且希望提供该输出并将其推送到div或其他地方,则可以使用
RenderControl
方法对其进行预渲染并获取HTML输出


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

在这种情况下,
中继器是否更有用

<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>

您可以将它绑定到您的数据源并为您节省大量的工作,因为这就是您正在做的事情。如果您只需要
转发器的HTML输出
,并且希望提供该输出并将其推送到div或其他地方,则可以使用
RenderControl
方法对其进行预渲染并获取HTML输出


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

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

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

这是一个简单的问题,只需要为每列添加新的tablecells即可。

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

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

它最终变成了一个简单的问题,只需要为每列添加新的TableCell。

@Jame213您为什么要将
Literal
控件与硬编码HTML一起使用,而不是使用内置的HTML对象(如
HtmlTable
)来构建一个适当的表控件,然后从
HtmlTable
控制自身?您可能需要显示更多的代码,如
AddSiteHeader()
中的内容,我假设它只返回文本
Site
。还有,为了启动和关闭您的
,添加了哪些代码?@Kelsey好吧,我正试图通过前一位开发人员在涉及动态表的其他页面上所做的工作来实现这一点,因此,除了使用前一位开发人员所做的工作之外,没有任何特殊原因说明我为什么使用文本。但是,如果您认为使用htmltable而不是文字会更好或更正确,那么我会试一试。@Jame213我建议使用一个
转发器
,正如我在下面所示,只需将
转发器以任何形式绑定到您的项目列表中。@Kelsey转发器可以处理从web服务上传的数据吗?您呢几乎可以将任何东西绑定到
中继器
。即使是
列表
也可以。我认为您应该研究ASP.NET中数据绑定的工作原理,因为您缺少一些真正有用的功能,这些功能可能会在将来为您节省大量时间。@Jame213您为什么要将
Literal
控件与硬编码HTML一起使用,而不是使用内置的HTML对象(如
HtmlTable
)来构建适当的表控件,然后从
HtmlTable
控件本身呈现HTML?您可能需要显示更多的代码,如
AddSiteHeader()
中的内容,我假设它只返回文本
Site
。还有,为了启动和关闭您的
,添加了哪些代码?@Kelsey好吧,我正试图通过前一位开发人员在涉及动态表的其他页面上所做的工作来实现这一点,因此,除了使用前一位开发人员所做的工作之外,没有任何特殊原因说明我为什么使用文本。但是,如果您认为使用htmltable而不是文字会更好或更正确,那么我会试一试。@Jame213我建议使用一个
转发器
,正如我在下面所示,只需将
转发器以任何形式绑定到您的项目列表中。@Kelsey转发器可以处理从web服务上传的数据吗?您呢几乎可以将任何东西绑定到
中继器
。即使是
列表
也可以。我认为您应该研究ASP.NET中数据绑定的工作原理,因为您缺少一些真正有用的功能,这些功能可能会在将来为您节省大量时间。