Как мне установить GridView RowHeaderColumn в TemplateField? - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть стандартный ASP.NET GridView, и я хотел бы, чтобы первый столбец (emplateField) отображался как <th>, или в терминах ASP.NET я хотел бы установить его на GridView RowHeaderColumn свойство. Но это свойство ищет имя DataItem (из BoundColumn).

Как я могу отобразить свой TemplateField с тегами <th>?

Ответы [ 3 ]

2 голосов
/ 01 октября 2011

Наконец-то нашли обходной путь для этого.Я не уверен, имеет ли этот код какое-либо отношение к хорошим практикам ASP.NET, но он помогает:

public class FirstColumnHeaderGridView : GridView
{
    protected override void InitializeRow(GridViewRow row, DataControlField[] fields)
    {
        DataControlFieldCell cell = new DataControlFieldHeaderCell(fields[0]);
        DataControlCellType header = DataControlCellType.DataCell;

        fields[0].InitializeCell(cell, header, row.RowState, row.RowIndex);
        row.Cells.Add(cell);


        DataControlField[] newFields = new DataControlField[fields.Length - 1];
        for (int i = 1; i < fields.Length; i++)
        {
            newFields[i - 1] = fields[i];
        }

        base.InitializeRow(row, newFields);
    }
}

Позвольте мне объяснить, что здесь происходит.Мы создаем специальный тип GridView, который будет отображать свой первый столбец с использованием тегов <th> независимо от того, как создается этот столбец.Для этого мы переопределяем метод InitializeRow.Этот метод в основном настраивает ячейки для строки.Мы обрабатываем первую ячейку, и пусть стандарт GridView позаботится обо всем остальном.

Конфигурация, которую мы применяем к ячейке, полностью взята из реализации GridView, и для нее достаточноотображается с тегом <th> вместо <td>.

После этого обходного пути использование является абсолютно стандартным - зарегистрируйте наш класс в качестве серверного элемента управления и используйте его как обычно GridView:

<%@ Register Assembly="WebApplication1" Namespace="WebApplication1" TagPrefix="wa1" %>
...
<wa1:FirstColumnHeaderGridView ID="Grid1" runat="server" ...>
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                Will be inside th
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                Will be inside td
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</wa1:FirstColumnHeaderGridView>
0 голосов
/ 14 января 2015

Поздно к игре, но нам нужно было установить scope="row" в среднем столбце, а не в первом.Чтобы сделать его универсальным, в производный класс GridView я добавил следующее свойство (аналогично встроенному свойству RowHeaderColumn GridView):

public int? RowHeaderColumnIndex
{
    get { return (int?)ViewState["RowHeaderColumnIndex"]; }
    set { ViewState["RowHeaderColumnIndex"] = value; }
}

Затем установите область действия:

protected override void OnRowCreated(GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow && RowHeaderColumnIndex.HasValue)
    {
        e.Row.Cells[RowHeaderColumnIndex.Value].Attributes["scope"] = "row";
    }
}

Когда вы размещаете свою пользовательскую сетку, просто установите RowHeaderColumnIndex="0" для первого столбца, "1" для второго столбца и т. Д.

0 голосов
/ 30 сентября 2011

Это то, что вы имеете в виду?

<Columns>
   <asp:TemplateField HeaderText="Código" ItemStyle-Width="9%">
      <HeaderTemplate>
          <asp:Label runat="server" Text="CodigoSAP"></asp:Label>
      </HeaderTemplate>
      <ItemTemplate>
          <asp:Label runat="server" ID="lblCodigoSAP" Text='<%# Bind("CodigoSAP") %>'>                  </asp:Label>
      </ItemTemplate>                                    
   </asp:TemplateField>

Я почти уверен, что неправильно понимаю, что ты скажешь?

...