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

  • Как добавить параметр «подтвердить удаление» в ASP.Net Gridview?
  • Как установить GridView внутри ScrollView
  • Простой пример сетки Android, использующий RecyclerView с GridLayoutManager (например, старый GridView)
  • Сетка изображений внутри ScrollView
  • Высота Gridview снижается
  • GridView с двумя столбцами, шириной заливки
  • Условно скрыть CommandField или ButtonField в Gridview
  • добавление текстового интерфейса для перетаскивания - Android / Java
  • Android gridview сохраняет выбранный элемент
  • Пересечение столбцов GridLayoutManager Android Recyclerview
  • Экспорт GridView в несколько листов Excel
  • Давайте будем гением компьютера.