Условно скрыть CommandField или ButtonField в Gridview

У меня есть GridView отображающий записи людей. Я хочу условно показать CommandField или ButtonField на основе некоторого свойства базовой записи. Идея состоит в том, чтобы разрешить выполнение команды только для определенных людей.

Каков наилучший способ сделать это? Я бы предпочел декларативное решение процедурного.

Сначала преобразуйте ButtonField или CommandField в TemplateField , а затем привяжите свойство Visible кнопки к методу, который реализует бизнес-логику:

            

Затем в коде позади добавьте метод:

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

Преимущество здесь заключается в том, что вы можете легко IsOverAgeLimit метод IsOverAgeLimit .

это может быть сделано, когда RowDataBound событие 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; } } } 

В демонстрации кнопка «Редактировать» не отображается (разметка HTML не отправляется клиенту) в тех строках, где возраст клиента равен 30.

Позвольте мне поделиться своим подходом с тем, что стоит. Для меня преобразование командного поля в элемент управления шаблоном не является опцией, так как поле commandfield имеет встроенную функциональность, которую я в противном случае должен был бы создать самостоятельно, например, тот факт, что при нажатии «Редактировать» он меняет значение «Отменить обновление» и что при нажатии кнопки «Правка» все ячейки в строке, которые являются метками, становятся текстовыми полями и т. д.

В моем подходе вы можете оставить поле команды как есть, тогда вы можете скрыть его по мере необходимости с помощью кода позади. В этом примере я скрываю это, если поле «Сценарий» сетки показывает текст «Фактический» для соответствующей строки события RowDataBound.

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

Скрыть всю колонку GridView

Если вы хотите полностью удалить столбец (то есть не только кнопку) из таблицы, используйте подходящий обработчик событий, например, для события OnDataBound , а затем OnDataBound соответствующий столбец целевого GridView . Выберите событие, которое будет срабатывать только один раз для этого OnRowDataBound управления, то есть не 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 } } 

Преобразуйте CommandField в TemplateField и установите видимое свойство кнопки в зависимости от значения поля (true / false)

  

Чтобы условно контролировать представление полей Template / Command, используйте событие RowDataBound для Gridview, например:

    ...        ...    

и следующие:

 protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) { Label lblOrderStatus=(Label) e.Row.Cells[4].FindControl("lblOrderStatus"); if (lblOrderStatus.Text== "Ordered") { lblOrderStatus.ForeColor = System.Drawing.Color.DarkBlue; LinkButton bt = (LinkButton)e.Row.Cells[5].Controls[0]; bt.Visible = false; e.Row.BackColor = System.Drawing.Color.LightGray; } } 

Если это было основано на ролях, вы могли бы использовать панель многопользовательской рекламы, но не уверены, можете ли вы сделать то же самое против свойства записи.

Однако вы можете сделать это с помощью кода. В вашем событии rowdatabound вы можете скрыть или показать кнопку в нем.

Вы можете скрыть CommandField или ButtonField на основе позиции (индекса) в GridView.

Например, если ваш CommandField находится в первой позиции (index = 0), вы можете скрыть его добавление следующего кода в событие RowDataBound для GridView:

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { ((System.Web.UI.Control)e.Row.Cells[0].Controls[0]).Visible = false; } } 

Я сделал очень простое, чтобы включить или отключить командную кнопку. Ниже моя grid

                 

В следующем методе я сделал изменения

  protected void grdOrderProduct_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { foreach (ImageButton button in e.Row.Cells[5].Controls.OfType()) { if (button.CommandName == "Delete") { button.Visible = false; } } } } 
                 

Используйте этот код, чтобы отключить кнопку удаления в gridview из кода позади.

 protected void gv_Document_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { ((LinkButton)e.Row.Cells[7].Controls[0]).Visible = false; } } 
  • Как скрыть столбцы в ASP.NET GridView с автогенерированными столбцами?
  • разделители / разделители строк сетки андроида
  • Как я могу экспортировать GridView.DataSource в datatable или dataset?
  • Как добавить параметр «подтвердить удаление» в ASP.Net Gridview?
  • GridView с двумя столбцами, шириной заливки
  • Отображение изображений из определенной папки на SD-карте с использованием gridview
  • как связать выпадающий список в gridview?
  • Android gridview сохраняет выбранный элемент
  • Получить значения DataKey в GridView RowCommand
  • Изменение цвета ячейки на разные значения - Gridview
  • GridView связан с свойствами вложенного classа
  • Давайте будем гением компьютера.