【问题标题】:Removing gridview edit column from .Master Page从.Master Page中删除gridview编辑列
【发布时间】:2013-11-30 15:35:44
【问题描述】:

我正在从事一个企业项目。因此,从数据录入操作员到上级管理人员都有很多用户。用户帐户分别存储在 UserData 表 中,它们各自的权限存储在 userprivileges 表 中。

gridview 支持事务中的多个表单,我为此提供了查看、编辑、更新选项,如下所示。

<asp:GridView ID="grvId".....>
   <Columns>
     <asp:BoundField..... />
     .
     .
      <asp:TemplateField AccessibleHeaderText="Edit" HeaderText="Edit">
          <ItemTemplate>
              <asp:Button ID="btnEdit" runat="server" CausesValidation="false" 
                  CommandName="Edit" Text="Edit" />
          </ItemTemplate>
          <EditItemTemplate>
              <asp:Button ID="btnUpdate" runat="server" CausesValidation="true" 
                  CommandName="Update" Text="Update" />
              <asp:Button ID="btnCancel" runat="server" CausesValidation="false" 
                  CommandName="Cancel" Text="Cancel" />
          </EditItemTemplate>
      </asp:TemplateField>
      <asp:ButtonField ButtonType="Button" CommandName="Delete" HeaderText="Delete" Text="Delete" />
   </Columns>
</asp:GridView>

我想要做的是,基于会话(用户当前登录),我必须设置 EDITDELETE 网格视图中的功能。

更新:这可以在 .Master 页面中实现并且可以从子页面调用吗?

【问题讨论】:

  • 您要显示/隐藏整个列,还是单个按钮?
  • 整列。管理员拥有所有权限。中层工人将具有添加权限。数据输入操作员可以添加数据但不能删除。诸如此类。
  • 与其使用母版页,不如创建一个继承自 System.Web.UI.WebControls.GridView 的类并将安全检查放在那里。

标签: c# asp.net session gridview


【解决方案1】:

在 C# Code-Behind 中,检查当前用户并检查 Privileges。

一旦您确定了这一点,您就可以简单地隐藏该列:

if (!userEdit) {
    grvId.Columns[0].Visible = false;
}

0 是编辑列的列号(记住集合从 0 开始),userEdit 变量是关于用户是否可以编辑网格的布尔值集。

【讨论】:

  • 我会试试@Nunners。但是,不是将其放在单独的形式中,而是可以在 .Master 页面中完成吗?
  • @Mahe 是的,您可以将它放在母版页中,使用以下代码从母版页访问 GridView(请注意,GridView ID 必须相同)GridView gv = (GridView)ContentPlaceHolder1.FindControl("grvId");。您还应该检查找到的值是否为 null 以避免在 GridView 不存在时出错。
  • 你的意思是,网格根本不存在。或者,网格还没有绑定值? - @Nunners?请说清楚。第一种情况,是的。大约有3份报告是这样的。仅声明了网格。甚至列也是基于用户的 sql 查询输出创建的。
  • @Mahe 对null的检查只会检查页面上是否真的存在GridView控件,与此时是否绑定数据无关。
【解决方案2】:

不直接回答问题,但在这种情况下,我会使用 CommandField (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.commandfield%28v=vs.110%29.aspx) 而不是多个按钮/模板列:

<asp:GridView ID="grvId" ...>
    <Columns>
        <asp:BoundField..... />
        <asp:CommandField ButtonType="Button" />
    </Columns>
</asp:GridView>

然后您可以像这样动态显示/隐藏按钮:

protected void Page_Load(object sender, EventArgs e)
{
    bool canEdit = isAdmin || isEditor;
    bool canDelete = isAdmin;

    // fetch the last column, which is the command field
    CommandField col = (CommandField)grvId.Columns[grvId.Columns.Count - 1];

    col.ShowEditButton = canEdit;
    col.ShowDeleteButton = canDelete;
}

当然,您需要用您的实际权限检查替换 isAdmin、isEditor 等。

【讨论】:

  • 在我的情况下无法将其更改为命令字段,因为它会导致所有页面(大部分)及其各自的调用相应更改。由于这是一个 ERP 项目,因此这样做会耗费大量时间,如果您在截止日期前工作,您不会想要这样的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多