使用ASP.NET GridView控件,如何在PageIndexchange后禁用GridViewRow中的控件或单个单元格?

使用ASP.NET GridView控件,如何在PageIndexchange后禁用GridViewRow中的控件或单个单元格?,asp.net,gridview,page-index-changed,gridviewrow,Asp.net,Gridview,Page Index Changed,Gridviewrow,我有一个数据绑定的GridView控件,可以根据用户角色禁用单个单元格。这只适用于第一页 private void LimitAccessToGridFields() { if (User.IsInRole("Processing")) return; foreach (GridViewRow gridViewRow in gvScrubbed.Rows) { var checkBox = ((CheckBox)

我有一个数据绑定的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上调用这个方法,它在那里工作。我在PageIndexhaging和PageIndexChanged事件处理程序中尝试过它,但它不起作用。调试时,该行中的两个控件似乎都成功地将Enabled设置为false。我的目标是在更改页面后,根据用户角色禁用这些字段。这应该如何实现?

我发现这必须在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;
            }
如果您需要固定点或过滤特定控件类型(复选框、文本框、标签等),并且只影响这些控件,那么只需测试它们

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

否。它不必位于RowDataBound事件内部。此外,并非所有GridView控件都依赖于数据源。