Как скрыть столбцы в ASP.NET GridView с автоматически сгенерированными столбцами? - PullRequest
32 голосов
/ 19 января 2010

GridView1.Columns.Count всегда равен нулю, даже SqlDataSource1.DataBind ();

Но с сеткой все в порядке

Я могу сделать

for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++)

Я переименовываю заголовки запросов здесь. но

GridView1.Columns[i].Visible = false;

Я не могу использовать его, потому что GridView1.Columns.Count равен 0.

Так как я могу их спрятать?

Ответы [ 12 ]

43 голосов
/ 19 января 2010

Попробуйте поместить e.Row.Cells[0].Visible = false; в событие RowCreated вашей сетки.

protected void bla_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false; // hides the first column
}

Таким образом, он автоматически скрывает весь столбец.

У вас нет доступа к сгенерированным столбцам через grid.Columns[i] в событии DataBound вашего gridview *.

11 голосов
/ 21 октября 2012

Коллекция столбцов заполняется только в том случае, если AutoGenerateColumns = false, а столбцы создаются вручную.

Хороший обходной путь для этого - динамическое заполнение коллекции Columns до установки свойства DataSource и вызова DataBind ().

У меня есть функция, которая вручную добавляет столбцы на основе содержимого таблицы данных, которую я хочу отобразить. После того, как я это сделал (а затем установил DataSource и вызвал DataBind (), я могу использовать коллекцию Columns, и значение Count является правильным, и я могу включать и выключать видимость столбца, как я изначально хотел.

static void AddColumnsToGridView(GridView gv, DataTable table)
{
    foreach (DataColumn column in table.Columns)
    {
        BoundField field = new BoundField();
        field.DataField = column.ColumnName;
        field.HeaderText = column.ColumnName;
        gv.Columns.Add(field);
    }
}
10 голосов
/ 19 января 2010

Примечание. Это решение работает только в том случае, если столбцы GridView известны заранее.

Звучит так, как будто вы используете GridView с AutoGenerateColumns=true, что по умолчанию. Я рекомендую установить AutoGenerateColumns=false и добавить столбцы вручную:

<asp:GridView runat="server" ID="MyGridView"
    AutoGenerateColumns="false" DataSourceID="MySqlDataSource">
    <Columns>
        <asp:BoundField DataField="Column1" />
        <asp:BoundField DataField="Column2" />
        <asp:BoundField DataField="Column3" />
    </Columns>
</asp:GridView>

И включайте только BoundField для каждого поля, которое вы хотите отобразить. Это даст вам наибольшую гибкость с точки зрения отображения данных.

5 голосов
/ 11 февраля 2010

У меня возникла та же проблема - нужно, чтобы значение AutogenerateColumns элемента управления GridView было равно true, поскольку оно связано с источником данных SQL, и поэтому мне нужно было скрыть некоторые столбцы, которые не должны отображаться в элементе управления GridView.

Чтобы сделать это, добавьте некоторый код в событие '_RowDataBound' вашего GridView, например, вот так (предположим, что идентификатор вашего GridView равен = 'MyGridView'):

protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[<index_of_cell>].Visible = false;
    }
}

That 'Я сделаю трюк просто отлично; -)

3 голосов
/ 06 февраля 2014

Попробуйте это, чтобы скрыть столбцы в ASP.NET GridView с автоматически сгенерированными столбцами, оба RowDataBound / RowCreated работают тоже.

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Or _
        e.Row.RowType = DataControlRowType.Header Then   // apply to datarow and header 

        e.Row.Cells(e.Row.Cells.Count - 1).Visible = False // last column
        e.Row.Cells(0).Visible = False  // first column

    End If
End Sub

Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowCreated

    If e.Row.RowType = DataControlRowType.DataRow Or _
        e.Row.RowType = DataControlRowType.Header Then

        e.Row.Cells(e.Row.Cells.Count - 1).Visible = False
        e.Row.Cells(0).Visible = False

    End If
End Sub
2 голосов
/ 19 января 2010

Вы должны выполнить GridView1.Columns[i].Visible = false; после того, как сетка была привязана к данным.

1 голос
/ 12 января 2016

В методе rowdatabound для 2-го столбца

GridView gv = (sender as GridView);
gv.HeaderRow.Cells[2].Visible = false;
e.Row.Cells[2].Visible = false;
1 голос
/ 12 февраля 2010

@ nCdy: index_of_cell следует заменить целым числом, соответствующим порядковому номеру ячейки, которую вы хотите скрыть в коллекции .Cells.

Например, предположим, что ваш GridView содержит следующие столбцы:

ИМЯ КОНТАКТА | КОНТАКТНЫЙ НОМЕР | CUSTOMERID | АДРЕСНАЯ ЛИНИЯ 1 | Почтовый индекс

И вы хотите, чтобы столбец CUSTOMERID не отображался. Поскольку индексы коллекций основаны на 0, индекс вашего столбца CUSTOMERID равен ..........? Это верно, 2 !! Отлично. Теперь ... угадайте, что вы должны вставить туда, чтобы заменить ' index_of_cell ' ??

0 голосов
/ 30 апреля 2019

Выполните итерацию по строкам GridView и сделайте ячейки целевых столбцов невидимыми. В этом примере я хочу, чтобы столбцы 4-6 были видны как есть, поэтому мы пропускаем их:

foreach (GridViewRow row in yourGridView.Rows)
   {
     for (int i = 0; i < rows.Cells.Count; i++)
     {
        switch (i)
        {
           case 4:
           case 5:
           case 6:
              continue;
        }
        row.Cells[i].Visible = false;
     };
   };

Затем вам нужно будет отдельно удалять заголовки столбцов (имейте в виду, что удаление ячеек заголовков изменяет длину GridView после каждого удаления):

grdReportRole.HeaderRow.Cells.RemoveAt(0);

0 голосов
/ 29 июля 2017

Аналогично принятому ответу, но позволяет использовать ColumnNames и связывается с RowDataBound ().

Dictionary<string, int> _headerIndiciesForAbcGridView = null;

protected void abcGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (_headerIndiciesForAbcGridView == null) // builds once per http request
    {
        int index = 0;
        _headerIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells
            .Cast<TableCell>()
            .ToDictionary(c => c.Text, c => index++);
    }

    e.Row.Cells[_headerIndiciesForAbcGridView["theColumnName"]].Visible = false;
}

Не уверен, работает ли он с RowCreated ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...