Подтвердить что ты не робот

Как скрыть столбцы в ASP.NET GridView с автогенерированными столбцами?

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

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

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

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

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

GridView1.Columns[i].Visible = false;

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

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

4b9b3361

Ответ 1

Попробуйте помечать 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] в событии gridview DataBound.

Ответ 2

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

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

У меня есть функция, которая вручную добавляет столбцы на основе содержимого DataTable, которое я хочу отобразить. Как только я это сделал (а затем установил 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);
    }
}

Ответ 3

Примечание. Это решение работает только в том случае, если столбцы 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 для каждого поля, которое вы хотите отобразить. Это даст вам максимальную гибкость в плане отображения данных.

Ответ 4

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

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

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

Это будет трюк просто отлично, -)

Ответ 5

Попробуйте это, чтобы скрыть столбцы в GridView ASP.NET с автогенерированными столбцами, и работа 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

Ответ 6

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

Ответ 7

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

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

ИМЯ КОНТАКТА | КОНТАКТНЫЙ НОМЕР | CUSTOMERID | АДРЕСНАЯ ЛИНИЯ 1 | POST CODE

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

Ответ 8

В методе rowdatabound для второго столбца

GridView gv = (sender as GridView);
gv.HeaderRow.Cells[2].Visible = false;
e.Row.Cells[2].Visible = false;

Ответ 9

Как сказано другими, RowDataBound или RowCreated событие должно работать, но если вы хотите избежать объявления событий и поместить весь код чуть ниже вызова функции DataBind, вы можете сделать следующее:

GridView1.DataBind()
If GridView1.Rows.Count > 0 Then
    GridView1.HeaderRow.Cells(0).Visible = False
    For i As Integer = 0 To GridView1.Rows.Count - 1
        GridView1.Rows(i).Cells(0).Visible = False
    Next
End If

Ответ 10

Я нашел ответ Стив Хиббер, чтобы быть очень полезным. Проблема, которую OP, казалось, описывала, - это проблема AutoGeneratedColumns в GridView.

В этом случае вы можете установить, какие столбцы будут "видимыми" и которые будут скрыты при привязке таблицы данных в коде.

Например: Gridview находится на странице следующим образом.

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" >
</asp:GridView>

И затем в коде, стоящем за программой PopulateGridView, вызывается во время события загрузки страницы.

protected void PopulateGridView()
{
    DataTable dt = GetDataSource();
    gv.DataSource = dt;
    foreach (DataColumn col in dt.Columns)
    {
        BoundField field = new BoundField();
        field.DataField = col.ColumnName;
        field.HeaderText = col.ColumnName;
        if (col.ColumnName.EndsWith("ID"))
        {
            field.Visible = false;
        }
        gv.Columns.Add(field);
    }
    gv.DataBind();
}

В приведенном выше разделе GridView AutoGenerateColumns установлено значение False, а codebehind используется для создания связанных полей. Один из них - получение источника данных как данных через один собственный процесс, который здесь я обозначил GetDataSource(). Затем один цикл проходит через коллекцию столбцов данных. Если имя столбца соответствует заданному критерию, вы можете соответствующим образом установить видимое свойство связанного поля. Затем вы привязываете данные к gridview. Это очень похоже на AutoGenerateColumns = "True", но вы получаете критерии для столбцов. Этот подход наиболее полезен, когда критерии скрытия и скрытия основаны на имени столбца.

Ответ 11

Подобно принятому ответу, но позволяет использовать 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().

Ответ 12

Выполните итерацию по строкам 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);