Условно скрыть CommandField или ButtonField в Gridview
У меня есть GridView
отображающий записи людей. Я хочу условно показать CommandField
или ButtonField
на основе некоторого свойства базовой записи. Идея состоит в том, чтобы разрешить выполнение команды только для определенных людей.
Каков наилучший способ сделать это? Я бы предпочел декларативное решение процедурного.
- GridView связан с свойствами вложенного classа
- Простой пример сетки Android, использующий RecyclerView с GridLayoutManager (например, старый GridView)
- разделители / разделители строк сетки андроида
- добавление текстового интерфейса для перетаскивания - Android / Java
- Lazy загружает изображения в gridView
- Как реализовать выбор полной строки в GridView без кнопки выбора?
- Добавление заголовка в GridView (Android)
- Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource
- Получить индекс Row в событии Rowcommand от Asp.net
- Отображение изображений из определенной папки на SD-карте с использованием gridview
- Экспорт GridView в несколько листов Excel
- Преобразование DBContext в ObjectContext для использования с GridView
- Пересечение столбцов GridLayoutManager Android Recyclerview
Сначала преобразуйте 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; } }