С помощью элемента управления GridView asp.net, как я могу отключить элементы управления или отдельные ячейки в GridViewRow после PageIndexchanged?
-
09-10-2019 - |
Вопрос
У меня есть элемент управления GRIDVIEW данных, в котором я могу отключить отдельные ячейки на основе роли пользователя. Это работает только на первой странице.
private void LimitAccessToGridFields()
{
if (User.IsInRole("Processing")) return;
foreach (GridViewRow gridViewRow in gvScrubbed.Rows)
{
var checkBox = ((CheckBox) gridViewRow.FindControl("cbScrubbed"));
checkBox.Enabled = false;
// ButtonField does not have an ID to FindControl with
// Must use hard-coded Cell index
gridViewRow.Cells[1].Enabled = false;
}
}
Я называю этот метод на странице_load, где он работает. Я пробовал это в планировщиках событий с страницами и страницами, где он не работает. При отладке, он, кажется, успешно установлен, включен в ложь в обоих элементах управления в строке. Моя цель - отключить эти поля, в зависимости от роли пользователя, после изменения страницы. Как это должно быть достигнуто?
Решение 2
Я обнаружил, что это должно быть сделано в обработчике событий Rowdatabound.
if (e.Row.RowType == DataControlRowType.DataRow)
{
// details elided ...
// Limits the access to grid fields.
if (!User.IsInRole("PROCESSING"))
{
cbstuff.Enabled = false; // a checkbox
e.Row.Cells[1].Enabled = false; //a link button
}
}
Другие советы
Вам не нужно повторять любые элементы управления, чтобы отключить или скрыть / видимо их.
Каждая клетка в управлении GRIDVIEW на самом деле является ссылкой на таблицу HTML, когда отображается (посмотрите на код на вашей странице, используя Firefly или Inspector).
Так почему бы не повторять все клетки, и любые элементы управления, найденные в каждой ячейке, просто отключайте их? Или вы можете просто петить через каждую строку своего GRIDVIEW и отключить или скрыть его напрямую, что повлияет на все внутри строки.
Скрытие с использованием ссылочного примера ячейки таблицы:
foreach (GridViewRow gRow in myGridView.Rows)
{
if (gRow.RowType == DataControlRowType.DataRow)
{
TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
foreach (TableCell tblCell in tbcCol)
tblCell.Enabled = false;
}
}
Так что это отключит все таблицы клетки по ячейке таблицы.
Или. Почему не просто отключить весь ряд?
foreach (GridViewRow gRow in myGridView.Rows)
{
if (gRow.RowType == DataControlRowType.DataRow)
gRow.Enable = false;
}
Если вам нужно PIN-точку или фильтровать определенные типы управления (флажок, TextBox, метку и т. Д.) и влияют только на эти элементы управления, а затем просто тестируйте их!
foreach (GridViewRow gRow in myGridView.Rows)
{
if (gRow.RowType == DataControlRowType.DataRow)
{
TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
foreach (TableCell tblCell in tbcCol)
if (((TextBox)tblCell) != null)
((TextBox)tblCell).Enable = false;
}
}