Как скрыть столбцы в ASP.NET GridView с автогенерированными столбцами?
GridView1.Columns.Count всегда равен нулю даже SqlDataSource1.DataBind ();
Но Сетка в порядке
я могу сделать
- Экспорт GridView в несколько листов Excel
- Как добавить параметр «подтвердить удаление» в ASP.Net Gridview?
- Преобразование DBContext в ObjectContext для использования с GridView
- Android: Как GridView auto_fit находит количество столбцов?
- Как удалить строку из GridView?
for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++)
Здесь я переименовываю заголовки запросов, но
GridView1.Columns[i].Visible = false;
Я не могу использовать его из-за GridView1.Columns.Count равен 0.
Так как я могу скрыть их?
- Пересечение столбцов GridLayoutManager Android Recyclerview
- Получить значения DataKey в GridView RowCommand
- Как скрыть столбец (GridView), но все же получить доступ к его значению?
- Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource
- GridView - отображать заголовки на пустом источнике данных
- как найти элемент управления в шаблоне редактирования элемента?
- Полная обратная передача, вызванная LinkButton внутри GridView внутри UpdatePanel
- Lazy загружает изображения в gridView
Попробуйте поместить 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 ().