0

我有一个数据绑定的 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。我的目标是在更改页面后根据用户角色禁用这些字段。这应该如何实现?

4

2 回答 2

1

您不需要遍历任何控件来禁用或隐藏/可见它们。

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;
  }
}
于 2016-05-31T02:08:17.757 回答
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
   }
}
于 2010-10-25T22:02:36.737 回答