С помощью элемента управления ASP.NET GridView, как можно отключить элементы управления или отдельные ячейки в GridViewRow после PageIndexChanged? - PullRequest
0 голосов
/ 19 октября 2010

У меня есть связанный с данными элемент управления 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; 
        }
    }

Я вызываю этот метод на Page_Load, где он работает. Я пробовал это в обработчиках событий PageIndexChaging и PageIndexChanged, где это не работает. Во время отладки он, похоже, успешно установил для параметра Enabled значение false в обоих элементах управления в строке. Моя цель - отключить эти поля в зависимости от роли пользователя после изменения страницы. Как это сделать?

Ответы [ 2 ]

1 голос
/ 31 мая 2016

Вам не нужно перебирать какие-либо элементы управления, чтобы отключить или скрыть / увидеть их.

Каждая ячейка в элементе управления 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;
            }

Если вам нужно точно определить или отфильтровать определенные типы элементов управления (CheckBox, TextBox, Label и т. Д.) И влияют только на эти элементы управления, а затем просто проверяют их!

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;
  }
}
0 голосов
/ 26 октября 2010

Я обнаружил, что это должно быть сделано в обработчике событий 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
   }
}
...