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

  • Получить индекс Row в событии Rowcommand от Asp.net
  • Как скрыть столбец (GridView), но все же получить доступ к его значению?
  • Как отключить прокрутку GridView в Android?
  • Android: Как GridView auto_fit находит количество столбцов?
  • Простой пример сетки Android, использующий RecyclerView с GridLayoutManager (например, старый GridView)
  • Как найти элемент управления в TemplateField GridView?
  • Android gridview сохраняет выбранный элемент
  • Условно скрыть CommandField или ButtonField в Gridview
  • Как установить GridView внутри ScrollView
  • Создание элементов таблицы GridView
  • как связать выпадающий список в gridview?
  • Interesting Posts

    Установка пакетов RODBC / ROracle на OS X Mavericks

    System.Timers.Timer / Threading.Timer vs Thread with WhileLoop + Thread.Sleep для периодических задач

    Секвенирование и реорганизация задач

    Изменение формата даты на «% d /% m /% Y»

    проверьте, отображается ли элемент: нет или блокируется при щелчке. Jquery

    Включение активных гиперссылок на синий

    Как вы сопоставляете enum как значение int с белым NHibernate?

    Как я могу использовать ssh для запуска команды на удаленном компьютере Unix и выйти до завершения команды?

    Ошибка «Не удалось отсоединить файл сокета» в MongoDB 3.0

    NoSQL Использовать сценарии использования или КОГДА использовать NoSQL

    Как настроить скорость вентилятора на 100% на ноутбуке?

    Почему я могу получить ошибку GRUB после удаления раздела Linux?

    Android-приложение не установлено. Уже установлен существующий пакет с тем же именем с конфликтующей сигнатурой

    Не удалось обновить версию Windows 10 от Home до Pro

    Как получить содержимое словаря Викисловаря?

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