Как скрыть столбцы в 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.

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

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

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

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

        

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

Коллекция 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); } } 

У меня была такая же проблема: нужно, чтобы мои 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[].Visible = false; } } 

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

Попробуйте это, чтобы скрыть столбцы в 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 

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

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

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

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

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

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

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

Как говорили другие, 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 

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

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

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

Подобно принятому ответу, но позволяет использовать ColumnNames и связывается с RowDataBound ().

 Dictionary _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() .ToDictionary(c => c.Text, c => index++); } e.Row.Cells[_headerIndiciesForAbcGridView["theColumnName"]].Visible = false; } 

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

  • Создание элементов таблицы GridView
  • Как установить GridView внутри ScrollView
  • Как получить значение ячейки по имени столбца не по индексу в GridView в asp.net
  • Сортировка GridView: SortDirection всегда по возрастанию
  • Высота Gridview снижается
  • GridView с двумя столбцами, шириной заливки
  • Пейджинговые и сортировочные сетки с ASP.Net MVC
  • Редактирование строки Gridview - динамическое связывание с DropDownList
  • Создать миниатюру
  • GridView связан с свойствами вложенного classа
  • Изменение цвета ячейки на разные значения - Gridview
  • Interesting Posts

    Функция gets () в C

    Почему .ToString () в нулевой строке вызывает нулевую ошибку, когда .ToString () отлично работает в nullable int с нулевым значением?

    bootstrap 4 размер столбца таблицы

    Использование Call SET для назначения переменной в пакете Dos «For» Loop

    Есть ли способ экспортировать URL-адреса открытых вкладок окна Firefox?

    Как можно добавить разделитель между элементами в ItemsControl

    Excel: как удалить поисковые запросы из ячейки (ссылающийся URL)

    Почему логические 4 байта в .NET?

    Как раз для всех, как правильно сохранить состояние экземпляра fragmentов в стеке?

    Urxvt – вкладка расширения переменных среды

    Очистите или заново создайте базу данных Ruby on Rails

    C # – Как сделать HTTP-вызов

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

    Что я могу сделать с кучей старых 1 ГБ / 512 МБ памяти DDR2 RAM?

    Как передать аргументы командной строки программе Node.js?

    Давайте будем гением компьютера.