有条件地隐藏Gridview中的CommandField或ButtonField

Lar*_*nal 26 asp.net gridview

我有一个GridView显示人员记录.我想有条件地显示CommandFieldButtonField基于底层记录的某些属性.我们的想法是只允许对特定人员执行命令.

做这个的最好方式是什么?我更喜欢程序性的声明性解决方案.

小智 59

首先,将您的ButtonField或转换CommandField为a TemplateField,然后将Visible按钮的属性绑定到实现业务逻辑的方法:

<asp:GridView runat="server" ID="GV1" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="Age" HeaderText="Age" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button runat="server" Text="Reject" 
                Visible='<%# IsOverAgeLimit((Decimal)Eval("Age")) %>' 
                CommandName="Select"/>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

然后,在后面的代码中,添加方法:

protected Boolean IsOverAgeLimit(Decimal Age) {
    return Age > 35M;
}
Run Code Online (Sandbox Code Playgroud)

这里的优点是你可以IsOverAgeLimit很容易地测试方法.

  • 正是我正在寻找的答案。很好,谢谢。您难道不喜欢那些没有详细记录的 GridView 功能吗?:-) (2认同)

Rus*_*Cam 13

它可以在RowDataBound事件发生时完成

  protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // Hide the edit button when some condition is true
      // for example, the row contains a certain property
      if (someCondition) 
      {
          Button btnEdit = (Button)e.Row.FindControl("btnEdit");

          btnEdit.Visible = false;
      }
    }   
  }
Run Code Online (Sandbox Code Playgroud)

这是一个演示页面

标记

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DropDownDemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>GridView OnRowDataBound Example</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField HeaderText="Name" DataField="name" />
                <asp:BoundField HeaderText="Age" DataField="age" />
                <asp:TemplateField>
                    <ItemTemplate>                
                        <asp:Button ID="BtnEdit" runat="server" Text="Edit" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

代码背后

using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;

namespace GridViewDemo
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = GetCustomers();
            GridView1.DataBind();
        }

        protected override void OnInit(EventArgs e)
        {
            GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
            base.OnInit(e);
        }

        void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType != DataControlRowType.DataRow) return;

            int age;
            if (int.TryParse(e.Row.Cells[1].Text, out age))
                if (age == 30)
                {
                    Button btnEdit = (Button) e.Row.FindControl("btnEdit");
                    btnEdit.Visible = false;
                }
        }

        private static List<Customer> GetCustomers()
        {
            List<Customer> results = new List<Customer>();

            results.Add(new Customer("Steve", 30));
            results.Add(new Customer("Brian", 40));
            results.Add(new Customer("Dave", 50));
            results.Add(new Customer("Bill", 25));
            results.Add(new Customer("Rich", 22));
            results.Add(new Customer("Bert", 30));

            return results;
        }
    }

    public class Customer
    {
        public string Name {get;set;}
        public int Age { get; set; }

        public Customer(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在演示中,在客户年龄为30岁的行中,"编辑"按钮不可见(HTML标记不会发送到客户端).


leo*_*ios 11

请允许我分享我的方法以获得它的价值.对于我来说,将命令字段转换为模板字段控件不是一个选项,因为命令字段带有内置功能,否则我必须自己创建,例如,当单击编辑时它更改为"更新取消"的事实,以及单击"编辑"时,行中作为标签的所有单元格都将成为文本框等.

在我的方法中,您可以按原样保留命令字段,然后您可以根据需要通过代码隐藏它.在这个例子中,如果网格字段"Scenario"显示RowDataBound事件的相关行的文本"Actual",我将隐藏它.

protected void gridDetail_RowDataBound(object sender, GridViewRowEventArgs e)
    {   
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (((Label)e.Row.FindControl("lblScenario")).Text == "Actual")
            {
                LinkButton cmdField= (LinkButton)e.Row.Cells[0].Controls[0];
                cmdField.Visible = false;
            }
    }}
Run Code Online (Sandbox Code Playgroud)

  • 我几乎放弃了,只是将我的命令字段转换为模板字段,但我知道它可以完成,所以我继续搜索它.我认为这应该是正确的答案.(虽然我仍然不确定提问者对陈述性答案的意思.) (2认同)

Sco*_*NET 6

隐藏整个GridView列

如果要从表中完全删除列(即不仅仅是按钮),请使用合适的事件处理程序(例如,对于OnDataBound事件),然后在目标上隐藏相应的列GridView.选择一个只会为此控件触发一次的事件,即不会OnRowDataBound.

ASPX:

<asp:GridView ID="grdUsers" runat="server" DataSourceID="dsProjectUsers" OnDataBound="grdUsers_DataBound">
    <Columns>
        <asp:TemplateField HeaderText="Admin Actions">
            <ItemTemplate><asp:Button ID="btnEdit" runat="server" text="Edit" /></ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
        <asp:BoundField DataField="LastName" HeaderText="Last Name" />
        <asp:BoundField DataField="Telephone" HeaderText="Telephone" />
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

aspx.cs:

protected void grdUsers_DataBound(object sender, EventArgs e)
{
    try
    {
        // in this case hiding the first col if not admin
        if (!User.IsInRole(Constants.Role_Name_Admin))
            grdUsers.Columns[0].Visible = false;
    }
    catch (Exception ex)
    {
        // deal with ex
    }
}
Run Code Online (Sandbox Code Playgroud)