使用ASP.NET GridView控件,如何在PageIndexchange后禁用GridViewRow中的控件或单个单元格?
我有一个数据绑定的GridView控件,可以根据用户角色禁用单个单元格。这只适用于第一页使用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)
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控件都依赖于数据源。