【问题标题】:colspan not getting applied to column of tablecolspan 未应用于表格列
【发布时间】:2019-05-23 19:58:00
【问题描述】:

我正在 Angular 应用程序中构建一个 UI,需要为下面屏幕截图中突出显示的名为 Subscriptions 的列执行 colspan。我尝试应用 colspan 但似乎没有生效。

我需要的是这样的

HTML

        <tr>
            <th class="tableItem bold">Legal Class Name</th>
            <th class="tableItem bold">Last Edited</th>
            <th class="tableItem bold">Legal Class ID</th>
            <th class="tableItem bold"></th>
            <th class="tableItem bold">TERMS</th>
            <th class="tableItem bold">SUBSCRIPTIONS</th>
            <th class="tableItem bold">Primary Currency</th>

        </tr>



        <ng-container>
            <!-- <tr *ngFor="let f of fundClass['LegalFundClassDetailsViewModel'] | keyvalue"> -->
            <tr *ngFor="let f of LegalFundClasses.LegalFundClassDetailsViewModel">
                <td class="tableItem">{{f.Description}}</td>
                <td class="tableItem"></td>
                <td class="tableItem">{{f.Id}}</td>
                <td class="tableItem"></td>
                <td class="tableItem"></td>
                <td colspan="5" class="tableItem"></td>
                <td class="tableItem"> 
                    <kendo-dropdownlist style="width:100%" [(ngModel)]="f.CurrencyId"
                     class="form-control  form-control-sm" [data]="Currencies"
                     [filterable]="false" textField="CURRENCY_NAME" [valuePrimitive]="true" valueField="CURRENCY_ID">
                  </kendo-dropdownlist>
               </td>

            </tr>
        </ng-container>
    </table>

在检查元素时会生成什么。我在三个屏幕截图中分享了它,因为很难在一个屏幕截图中捕获

屏幕截图 1 - 标题部分

屏幕截图 2 - 行部分 - 展开

屏幕截图 3 - 行部分 - 折叠

折叠视图中整个表格的屏幕截图 4

编辑

我已经尝试了@cpcolella 建议的伪代码,但需要显示如帖子中上面的屏幕截图所示

所以它应该显示 合法类名 Class A Class B Class C 一排

  <div *ngIf="LegalFundClasses && LegalFundClasses.LegalFundClassDetailsViewModel && ColumnNames">


     <table class="fundClassesTable table-striped">
      <tr *ngFor="let c of ColumnNames">
        <th class="tableItem bold">{{ c }}</th>
        <ng-container *ngFor="let f of LegalFundClasses.LegalFundClassDetailsViewModel">
          <td class="tableItem" *ngIf="c == ColumnNames[0]">{{f.Description}}</td>
          <td class="tableItem" *ngIf="c == ColumnNames[1]">{{f.AuditSummary}}</td>
          <td class="tableItem" *ngIf="c == ColumnNames[2]">{{f.Id}}</td>
        </ng-container>
      </tr>
      </table>

        </div>
    </div>

上述逻辑的输出

【问题讨论】:

  • Ehm,如果您需要一个 td 来跨越 5 列,为什么 td 与源中的 ths 一样多?
  • 要求是记录需要横向显示
  • 我不能 100% 确定,但这可能是因为您需要将 th 元素与 td 元素匹配才能工作。尝试将th colspan="5" 放在上面的tr 中的倒数第二个位置。
  • @pjlamb12 嗯,没有。 colspan 的全部目的是能够在一行中跨越比另一行更多的列。
  • 目的是能够跨越更多的列,而不仅仅是一个。但我很确定每行中的列数必须与其他行相同,否则布局会混乱并且不起作用。在 WE Schools 的这个示例中,它使用 colspan,但它们的每一行仍然具有相同数量的列。 w3schools.com/tags/att_td_colspan.asp

标签: html angular


【解决方案1】:

您生成的代码错误。我不使用angular,但最终的表结构应该是这样的:

<table>

<tr>
<th class="tableItem bold">Legal Class Name</th>
<th class="tableItem">Class B</th>
<th class="tableItem">Class A</th>
<th class="tableItem">Class D</th>
<th class="tableItem">Class B</th>
<th class="tableItem">Class A</th>
<th class="tableItem">Class B1</th>
<th class="tableItem">Class C</th>
</tr>

<tr>
<td class="tableItem bold">Last edited</td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
</tr>

<tr>
<td class="tableItem bold">Legal class ID</td>
<td class="tableItem">123</td>
<td class="tableItem">123</td>
<td class="tableItem">123</td>
<td class="tableItem">123</td>
<td class="tableItem">123</td>
<td class="tableItem">123</td>
<td class="tableItem">123</td>
</tr>

<tr>
<td class="tableItem bold">Subscription</td>
<td colspan = "7"> </td>
</tr>

</table>

我只生成了 3 行。如您所见,每行有 8 列(和您的一样),除了最后一列,只有 2 列,其中一列跨越 7 列。

您不应该使用 for 循环来生成所有行,因为订阅行不同。

【讨论】:

  • 在角度上,我所做的只是使用 for 循环动态生成行,因为它们会不时发生变化。所以我不能硬编码你的解决方案中提到的行
  • 然后您可以在 for 循环中以某种方式检查订阅行是否正在格式化。如果是,则使用 colspan,如果否,则使用常规格式。
  • 如果你在我的代码中看到我已经在做这个 那为什么不工作。此 td 用于订阅
  • 嗯,首先,您正在垂直生成表格(它不是那样工作的)。 HTML 中的表格是水平定义的(第一个单元格,第二个单元格...下一行,)。您必须定义第一行,然后定义第二行,依此类推。您可以在我的示例中看到,第一个 TR 定义了带有标题的行,第二个 TR 定义了带有 Last Edited 的行,依此类推。我的示例渲染正常,您只需以角度实现逻辑,即可获得相同的最终结果。请记住,所有行都具有相同的结构,除了订阅行(您需要一个 IF 来检查)。
【解决方案2】:

你不能选择 tr 和 td 去哪个方向。 tr 总是一行。 td 和 th 始终是在该行中创建新列的单元格。 colspan 让一个 td 或 th 占据多列。你的桌子应该看起来像这样(虽然我也不熟悉角度)。

table {
  border-collapse: collapse;
  width: 100%;
}

table, td {
  border: 1px solid black;
  text-align: center;
  padding: 5px;
}

th {
  border: 1px solid black;
  text-align: left;
  padding: 5px;
}

tr:hover {background-color: #EFF3FB;}

td:nth-child(odd) {background-color: #E7EFFE;}
<table style="border-style: solid; border-width: 1px; padding: 25px;">

<tr>
<th class="tableItem bold">Legal Class Name</th>
<td class="tableItem">Class B</td>
<td class="tableItem">Class A</td>
<td class="tableItem">Class D</td>
<td class="tableItem">Class B</td>
<td class="tableItem">Class A</td>
<td class="tableItem">Class B1</td>
<td class="tableItem">Class C</td>
</tr>

<tr>
<th class="tableItem bold">Last edited</th>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
<td class="tableItem"></td>
</tr>

<tr>
<th class="tableItem bold">Legal class ID</th>
<td class="tableItem">11166</td>
<td class="tableItem">11167</td>
<td class="tableItem">13714</td>
<td class="tableItem">13717</td>
<td class="tableItem">13713</td>
<td class="tableItem">13716</td>
<td class="tableItem">13715</td>
</tr>

<tr>
<th class="tableItem bold">Subscription</th>
<td colspan = "7"> </td>
</tr>

</table>

https://stackoverflow.com/a/31408141/7724517

编辑: 你需要有两个循环。一个遍历 LegalClass 对象中的所有水平标题及其相关字段(外部),一个遍历所有法律类对象(内部)。外部的将标题项放在第一位(例如:Legal Class Name),内部的将放置每个合法类的值(在本例中为描述)。我希望这是有道理的。这个伪代码有点像python。

FieldNames = {'Legal Class Name':'Description', 'Last Edited':'', 'Legal Class ID':'Id', 'TERMS':'', 'SUBSCRIPTIONS':'', 'Primary Currency':'CurrencyId'}
html = ""
foreach Field in FieldNames:
    html += "<tr> <th class="tableItem bold">Field.Key</th>"
    foreach LegalClass in LegalClassList:
        html += "<td class="tableItem">LegalClass.Field.Value</td>""
    html += "</tr>"

编辑 2: 可能是这样的。再说一次,我不精通angualar。

<table>
  <ng-container>
    <tr *ngFor="let Row of Rows">
      <th class="tableItem bold">{{ Row.Header }}</th>
      <td *ngFor="let LFC of LegalFinancialClass" class="tableItem"> {{ LFC.Row.Value }} </td>
    </tr>
  </ng-container>
</table>

【讨论】:

  • 在角度上,我所做的只是使用 for 循环动态生成行,因为它们会不时发生变化。所以我不能硬编码或预先定义你的解决方案中提到的行
  • @Tom 注意到虽然每个tr 元素都有一个th 并且其中的每个td 是每个法律类别的相同元素,而不是每个tr 中的相同元素为 Legal Class 中的每个字段包含一个 td
  • 我仍在努力如何生成您建议的方式。
  • @Tom 再次我不熟悉角度,但也许我可以做一些伪代码来帮助你。我会编辑我的答案
  • 希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多