当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有条件地隐藏Gridview中的CommandField或ButtonField》经验,为你挑选了4个好方法。

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

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



1> 小智..:

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


    
        
        
        
            
                
            
        
    

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

protected Boolean IsOverAgeLimit(Decimal Age) {
    return Age > 35M;
}

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



2> Russ Cam..:

它可以在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;
      }
    }   
  }

这是一个演示页面

标记

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DropDownDemo._Default" %>



    GridView OnRowDataBound Example


    

代码背后

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 GetCustomers()
        {
            List results = new List();

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

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



3> leoinlios..:

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

在我的方法中,您可以按原样保留命令字段,然后您可以根据需要通过代码隐藏它.在这个例子中,如果网格字段"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;
            }
    }}


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

4> Scotty.NET..:
隐藏整个GridView列

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

ASPX:


    
        
            
        
        
        
        
    

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

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有