С помощью элемента управления GridView asp.net, как я могу отключить элементы управления или отдельные ячейки в GridViewRow после PageIndexchanged?

StackOverflow https://stackoverflow.com/questions/3963603

Вопрос

У меня есть элемент управления 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;
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top