如何在 ASP.NET Webforms 中动态设置 HtmlTableCell 的值?

Posted

技术标签:

【中文标题】如何在 ASP.NET Webforms 中动态设置 HtmlTableCell 的值?【英文标题】:How to set value of HtmlTableCell dynamically in ASP.NET Webforms? 【发布时间】:2021-12-18 21:25:03 【问题描述】:

我有一个 aspx 文件,它的一小部分代码是

<table class="table table-responsive-sm table-bordered table-hover" runat="server" style="align-content:center;">
   <tr><th>Header1</th></tr>
   <tr><td id="name1"></td></tr>
</table>

<table class="table table-responsive-sm table-bordered table-hover" runat="server" style="align-content:center;">
   <tr><th>Header2</th></tr>
   <tr><td id="name2"></td></tr>
</table>

<%-- Similary there are manly table lets say upto 20 --%>

<table class="table table-responsive-sm table-bordered table-hover" runat="server" style="align-content:center;">
   <tr><th>Header20</th></tr>
   <tr><td id="name20"></td></tr>
</table>

它后面的代码就像设置值是每个 td :

public void Page_Load()

   name1.InnerText = "1"
   name2.InnerTex = "2"
   //similary all td is assigned like this
   name20.InnerText = "20"

这很好用,但将来可能会有很多表,比如说 100。那么我是否需要像上面的代码一样设置所有值。还有其他方法吗?

我尝试使用以下代码:

for(int i=1; i<21; i++)

   tableId = (htmlTableCell)this.Page.Master.FindControl("name" + i.ToString());
   tableId = (HtmlTableCell)this.Page.FindControl("name" + i.ToString());
   tableId = (HtmlTableCell)this.FindControl("name" + i.ToString());

   tableId.InnerText = i.toString();


但 tableId 的值始终为空。

我该如何解决这个问题?

【问题讨论】:

你可以使用中继器 @Aristos 任何代码示例。我尝试使用上面的 for 循环,但 tableId 值始终为空。 如果我明天有时间我会做一个样品 【参考方案1】:

好的,这是我们想要考虑不同方法的情况之一。

现在,我认为这里有 10 甚至 20 张桌子是没有意义的。

让我们思考这个问题:

我需要 20 个整数变量。

做,我做这个:

int x1;
int x2;
int x3;
... and so on for 20 variables?

不,我们不这样做。我们会这样做:

int[20] x;

现在,我可以使用 for 循环,甚至是 foreach 之类的。

同样的问题也适用于您的探针。

你有一个需要“很多”的群体或事物。

正如 cmets 中的其他人所建议的,中继器(或列表视图、数据列表、网格视图)是控件或“系统”,可让您轻松“重复”某些内容。

所以,我喜欢这个“数组”可能需要 2 或 50 个这些“东西”。

尝试编写一个 html 编写器或一些循环来创建这个重复的东西是没有意义的。我们可以在代码中做到这一点。

所以,让我们使用中继器。

这样说:

     <asp:Repeater ID="Repeater1" runat="server" 
            OnItemDataBound="Repeater1_ItemDataBound">
            <ItemTemplate>

               <asp:Label id="MyHeader" runat="server" 
                 Text='<%# Eval("TableGroup") %>'
                 Font-Size="X-Large" >
            </asp:Label>

            </ItemTemplate>
        </asp:Repeater>

非常简单。现在,我们想要 2 个表组,还是 60 个?

我们加载上述内容的代码如下所示:

我们将简单地创建一个我们想要重复的“什么”列表。

所以,让我们创建具有类似表结构的东西。事实上,让我们创建一个 .net 表!!!

假设我们在上面放了一个按钮,然后这段代码:

    protected void Button1_Click(object sender, EventArgs e)
    

        DataTable TblList = new DataTable();
        TblList.Columns.Add("TableGroup");

        for (int i = 1;i<=3;i++)
        
            DataRow OneRow = TblList.NewRow();
            OneRow["TableGroup"] = "Table " + i;
            TblList.Rows.Add(OneRow);
        

        Repeater1.DataSource = TblList;
        Repeater1.DataBind();
    

请注意,我们多么干净、多么简单,以及我们如何不必“尝试”并编写代码来吐出标记。虽然 for/loop 是 3,但我们可以将其设为 30。

现在我们的输出是这样的:

所以,请注意我们“制作”的内容是如何重复 3 次的。但它也可以重复 20 或 100 次。

现在,在每个中继器内部,我们需要一个表。再一次,我们“可以”使用一张桌子。但是如果您考虑一下,表格需要一个标题,然后是行,我们必须为每一行定义一个列。

再一次,这是相当多的工作。所以,让我们使用一个可以一次性显示 + 渲染整个表格的控件!

我建议使用网格视图。所以,现在在上面的中继器中,让我们进入那个网格视图。

我们甚至使用您指定的引导类 - (因为它们看起来非常好 - 你做得很好!!!!)。

好的,现在我们的中继器变成了这样:

        <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
            <ItemTemplate>

               <asp:Label id="MyHeader" runat="server" 
                 Text='<%# Eval("TableGroup") %>'
                 Font-Size="X-Large" >
            </asp:Label>

             <asp:GridView ID="GTable" runat="server"
                 class="table table-responsive-sm table-bordered table-hover" Width="20%">
             </asp:GridView>

            </ItemTemplate>
        </asp:Repeater>
        <br />

请注意我们到目前为止的标记很少。 Gridview 确实只是一张不错的表格 - 但工作量和麻烦都更少。

所以,现在我们需要添加代码来填充每个组的表格。

事实证明,为我们创建每个组都会触发 HANDY 事件!!!!

所以,让我们准备一张表格 - 说出用户名和年龄。

所以,我们使用 ItemDataBound 事件。每个组都会触发此事件!!!

所以,3 组或 60 组 - 没关系。

所以,我们可以编写一个表格,然后将其直接填充到我们的 gridview 中。

这段代码:

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    

        // each new group/thing, lets fill the grid/table
        GridView gV = (GridView)e.Item.FindControl("GTable");

        DataTable TestTable = new DataTable();

        TestTable.Columns.Add("Name");
        TestTable.Columns.Add("Age");

        int TableGroup = e.Item.ItemIndex + 1;
        // add 3 rows
        for (int i = 1; i <= 3; i++)
        
            DataRow OneRow = TestTable.NewRow();
            OneRow["Name"] = "Group " + TableGroup + " Name " + i;
            OneRow["Age"] = i * 15;
            TestTable.Rows.Add(OneRow);
        

        gV.DataSource = TestTable;
        gV.DataBind();

    

再次注意:

我们只为一件事编写代码。可能会一遍又一遍地重复,但我们不在乎。另请注意,以这种方式思考是多么“容易”。

现在,我确实包含了中继器“索引”,以便至少为每个表添加一些不同的行。

再次注意创建该表的好处。它为我们提供了标题、行、列

都在一个漂亮的简单结构中。

我们的输出现在是这样的:

这不酷吗?

所以,现在有了上面的自动渲染。

你想做什么?抓住一个特定的中继器项目?也许为每个网格行添加一个按钮?我们可以这样做,这样做一次,它会为我们重复。

但是,你可以这样说第二行:

   protected void Button2_Click(object sender, EventArgs e)
    
        // get 2nd repeater (0 based, so get #1)

        int RepeatNum = 1;

        RepeaterItem MyRepItem = Repeater1.Items[RepeatNum];

        // ok, got the item, get <h2> header item
        // 
        Label MyHead = (Label)MyRepItem.FindControl("MyHeader");
        Debug.Print(MyHead.Text);

        // now get our grid
        GridView GV = (GridView)MyRepItem.FindControl("GTable");

        foreach (GridViewRow gRow in GV.Rows)
        
            Debug.Print("Name = " + gRow.Cells[0].Text);
            Debug.Print("Age  = " + gRow.Cells[1].Text);
        

输出窗口:

Table 2
Name = Group 2 Name 1
Age  = 15
Name = Group 2 Name 2
Age  = 30
Name = Group 2 Name 3
Age  = 45

所以要分组思考。我的标记很少。更好的是后面的代码不会尝试吐出 ZILLION "tr" "th" "table" 等。我不编写所有 HTML - 但利用内置工具。

很好的是,我现在可以改变主意,将其渲染为在整个页面上显示“两件事”——有点像“卡片视图”。

所以,我们为小组写了一件事情。

所以我们为表格写了一件事情。

然后我们一遍又一遍地重复。

【讨论】:

以上是关于如何在 ASP.NET Webforms 中动态设置 HtmlTableCell 的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET WebForms 中触发模式窗口?

asp.net webforms ajax 更新gridview

ASP.Net WebForms + Paypal 表单

将 ASP.Net MVC 与 WebForms 相结合

如何将 Perl 与 ASP.NET Webforms 集成?

如何检索 HTML POST 数据以在 ASP.NET WebForms 中进行操作?