Как скрыть столбцы в 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.
Так как я могу скрыть их?
Ответы
Ответ 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);