Условно скрыть 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; } } 
  • Пересечение столбцов GridLayoutManager Android Recyclerview
  • Изменение цвета ячейки на разные значения - Gridview
  • Android: Как GridView auto_fit находит количество столбцов?
  • Как я могу экспортировать GridView.DataSource в datatable или dataset?
  • Преобразование DBContext в ObjectContext для использования с GridView
  • Как скрыть столбец (GridView), но все же получить доступ к его значению?
  • Полная обратная передача, вызванная LinkButton внутри GridView внутри UpdatePanel
  • Добавление заголовка в GridView (Android)
  • Как найти элемент управления в TemplateField GridView?
  • Лучший способ сделать сортировку WPF ListView / GridView при нажатии на заголовок столбца?
  • Как удалить строку из GridView?
  • Interesting Posts

    Outlook не показывает уведомления на рабочем столе при получении сообщения

    Как обрабатывать событие click в столбце Button в Datagridview?

    Могу ли я изменить язык Windows 8 Pro после покупки ПК?

    Почему подключенный раздел NTFS не отображается в файловом менеджере Linux?

    Формат даты-времени как сезонов в R?

    Поддерживается ли Java 8 в Windows XP?

    Excel: подсчет количества значений MAX в диапазоне

    ggplot с центрированными именами на карте

    Простая Java-клиентская / серверная программа

    Примитивный тип «короткий» – литье в Java

    Как разрезать ненужные видеоролики и присоединить остальные к одному видео с помощью FFmpeg?

    Запретить отображение двойной фигурной фигурной скобки на мгновение, прежде чем angular.js будет компилировать / интерполировать документ

    Таймер Javax.swing повторяет штраф, но ActionListener ничего не делает

    Могут ли виртуальные машины заражать свой хост?

    Почему именно это зло?

    Давайте будем гением компьютера.