2010-06-15 1 views
4

С MSDN article на эту тему, мы можем видеть, что мы создаем TableHeaderRow, который содержит TableHeaderCell s.На asp: Table Control, как мы создаем thead?

Но они добавляют заголовок таблицы, как это:

myTable.Row.AddAt(0, headerRow); 

, который выводит HTML:

<table id="Table1" ... > 
<tr> 
    <th scope="column" abbr="Col 1 Head">Column 1 Header</th> 
    <th scope="column" abbr="Col 2 Head">Column 2 Header</th> 
    <th scope="column" abbr="Col 3 Head">Column 3 Header</th> 
</tr> 
<tr> 
    <td>(0,0)</td> 
    <td>(0,1)</td> 
    <td>(0,2)</td> 
</tr> 

... 

и он должен иметь <thead> и <tbody>(так он работает бесшовные с TableSorter):)

<table id="Table1" ... > 
<thead> 
<tr> 
    <th scope="column" abbr="Col 1 Head">Column 1 Header</th> 
    <th scope="column" abbr="Col 2 Head">Column 2 Header</th> 
    <th scope="column" abbr="Col 3 Head">Column 3 Header</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
    <td>(0,0)</td> 
    <td>(0,1)</td> 
    <td>(0,2)</td> 
</tr> 
    ... 
    </tbody> 

код ASPX HTML является

<asp:Table ID="Table1" runat="server" /> 

Как я могу выводить правильный синтаксис?


Подобно тому, как информация, управление GridView имеет этот встроенный, как нам нужно просто установить Accesbility и использовать HeaderRow

gv.UseAccessibleHeader = true; 
gv.HeaderRow.TableSection = TableRowSection.TableHeader; 
gv.HeaderRow.CssClass = "myclass"; 

но вопрос для контроля Table.

ответ

2

Просто нашел способ сделать это, мы должны использовать наши собственные элементы управления, которые наследуют от контроля базы, например Table

public class myTable : System.Web.UI.WebControls.Table 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     Table table = Controls[0] as Table; 

     if (table != null && table.Rows.Count > 0) 
     { 
      // first row is the Table Header <thead> 
      table.Rows[0].TableSection = TableRowSection.TableHeader; 
      // last row is the Footer Header <tfoot> (comment for not using this) 
      table.Rows[table.Rows.Count - 1].TableSection = TableRowSection.TableFooter; 

      FieldInfo field = typeof(WebControl).GetField("tagKey", BindingFlags.Instance | BindingFlags.NonPublic); 
      foreach (TableCell cell in table.Rows[0].Cells) 
       field.SetValue(cell, HtmlTextWriterTag.Th); 
     } 
     base.OnPreRender(e); 
    } 
} 

отлично работает с DataGrid а

public class myDataGrid : System.Web.UI.WebControls.DataGrid 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     Table table = Controls[0] as Table; 

     if (table != null && table.Rows.Count > 0) 
     { 
      // first row is the Table Header <thead> 
      table.Rows[0].TableSection = TableRowSection.TableHeader; 
      // last row is the Footer Header <tfoot> (comment for not using this) 
      table.Rows[table.Rows.Count - 1].TableSection = TableRowSection.TableFooter; 

      FieldInfo field = typeof(WebControl).GetField("tagKey", BindingFlags.Instance | BindingFlags.NonPublic); 
      foreach (TableCell cell in table.Rows[0].Cells) 
       field.SetValue(cell, HtmlTextWriterTag.Th); 
     } 
     base.OnPreRender(e); 
    } 
} 

, то, например, вам просто нужно использовать его вместо базового элемента управления:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     myGridView dg = new myGridView(); 
     dg.DataSource = new string[] { "1", "2", "3", "4", "5", "6" }; 
     dg.DataBind(); 

     ph.Controls.Add(dg); 
    } 
} 

и в ASPX странице, просто добавьте держатель место как:

<asp:PlaceHolder ID="ph" runat="server" /> 

full example in pastebin

0

Я собирался предложить вам попробовать декларативный синтаксис, но теперь я знаю, что вы имеете в виду; следующий код ...:

<asp:Table runat="server" ID="sometable"> 
    <asp:TableHeaderRow BackColor="#ADD9E6"> 
     <asp:TableHeaderCell ID="DataHeader" CssClass="Heading1" Text="Data Header" /> 
    </asp:TableHeaderRow> 
    <asp:TableRow> 
     <asp:TableCell>Data</asp:TableCell> 
    </asp:TableRow> 
</asp:Table> 

... Аналогичные результаты были получены к тому, что вы вывесили:

<table id="sometable" border="0"> 
<tr style="background-color:#ADD9E6;"> 
    <th id="DataHeader" class="Heading1">Data Header</th> 
</tr><tr> 
    <td>Data</td> 
</tr> 
</table> 

Возможно, пользовательский элемент управления может быть создан, чтобы решить вашу проблему? Похоже на избыток, но, по крайней мере, вы можете контролировать, что такое сгенерированный вывод.

Другой вариант - наследовать от класса System.Web.UI.WebControls.Table и override how the table is rendered.

+0

Я не могу использовать декларативный синтаксис :(это динамическая таблица, только на RunTime я знаю, сколько то, что столбцы все. .. эта идея использует XML, который создается дизайнером для создания «Grid» – balexandre

0

Если вы можете использовать DataGrid, когда вы назовете столбцы в шаблоне, он будет соответствующим образом сформировать thead и tbody.

+0

DataGrid не делает это по умолчанию – balexandre

1

Обратите внимание: это VB.net ответ на тот же вопрос, вы могли бы просто преобразовать это C#, используя любое количество бесплатных онлайн-конвертеров.

Создайте простую таблицу HTML с темой & tbody. Мне особенно нужен элемент thead для плагина jQuery tablesorter.

Dim ta As Table 
    Dim thr As TableHeaderRow 
    Dim thc As TableHeaderCell 
    Dim tr As TableRow 
    Dim td As TableCell 

    ta = New Table 
    ' make a header row & explicitly place it into the header section 
    thr = New TableHeaderRow 
    thr.TableSection = TableRowSection.TableHeader 
    ' add cells to header row 
    thc = New TableHeaderCell 
    thc.Text = "ID" 
    thr.Cells.Add(thc) 
    thc = New TableHeaderCell 
    thc.Text = "DESC" 
    thr.Cells.Add(thc) 
    ' create a data row & append cells to it 
    tr = New TableRow 
    td = New TableCell 
    td.Text = "101" 
    tr.Cells.Add(td) 
    td = New TableCell 
    td.Text = "VB.net is not so bad." 
    tr.Cells.Add(td) 
    ' append the header & row to the table 
    ta.Rows.Add(thr) 
    ta.Rows.Add(tr) 

    ' add the new table to your page 
    Page.Controls.Add(ta) 
+0

у вас не возник вопрос, если у вас есть источник данных, почему я хочу делать все вручную, вычислять количество столбцов, строк и т. д., если бы я мог просто сделать «myTable.DataSource = myDataSource;», и все, что я хочу, - это создать e '' как все остальное уже есть! – balexandre

1

Я на миллион лет опаздываю на это, но мне просто нужно было сделать то же самое. Он обрабатывает то же самое, что и сетка.

 foreach (var item in dynamicData) 
     { 
      var c = new TableHeaderCell() 
      c.Text = item.Whatever; 
      hr.Cells.Add(c); 
     } 
     //This is the important line 
     hr.TableSection = TableRowSection.TableHeader; 

     MyTable.Rows.Add(hr); 
0

TableSection="TableHeader" Добавить в TableHeaderRow как:

<asp:TableHeaderRow ID="TableHeaderRow2" 
runat="server" TableSection="TableHeader" >