2010-10-18 6 views
0

У меня есть связанный с данными элемент управления GridView, в котором я могу отключить отдельные ячейки на основе роли пользователя. Это работает только на первой странице.С элементом управления ASP.NET GridView, как отключить элементы управления или отдельные ячейки в GridViewRow после PageIndexChanged?

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

ответ

0

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

Нет. Он НЕ должен находиться внутри события RowDataBound. Кроме того, не все средства управления GridView полагаются на источник данных. – Fandango68

1

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

Каждая ячейка в элементе управления GridView на самом деле является ссылкой на таблицу HTML при визуализации (см. Код на вашей странице с помощью FireFly или Inspector).

Так почему бы не перебрать все ячейки и какие-либо элементы управления, обнаруженные в каждой ячейке, просто отключите их? Или вы можете просто прокрутить каждую строку вашего GridView и отключить или скрыть его напрямую, что повлияет на все внутри строки.

Скрытие с использованием таблицы ссылочный Cell пример:

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, этикетки и т.д.) и влияют только те элементы управления, а затем просто проверить их!

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; 
    } 
}