2010-11-19 2 views
0

У меня есть GridView, у которого есть ссылка для удаления записи. Я создал класс DeleteButtonField, но хочу заменить текст изображением (значком). Это возможно? Вот мой GridView:Можно заменить ButtonField на изображение в GridView?

<asp:GridView 
    ID="GridView1" 
    runat="server" 
    <.. removed dome properties ..> 
    > 
    <Columns> 
    <CustomControls:DeleteButtonField ConfirmText="Delete this record?" /> 
    <.. other columns ..> 
    </Columns> 
</asp:GridView> 

и вот мой класс DeleteButtonField:

using System; 
using System.Web.UI.WebControls; 

namespace CustomControls 
{ 
    public class DeleteButtonField : ButtonField 
    { 
     private string _confirmText = "Delete this record?"; 

     public string ConfirmText 
     { 
      get { return _confirmText; } 
      set { _confirmText = value; } 
     } 

     public DeleteButtonField() 
     { 
      this.CommandName = "Delete"; 
      this.Text = "Delete"; 
      this.ImageUrl = "App_GlobalResources/Del.png"; // doesn't work 
     } 

     public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) 
     { 
      base.InitializeCell(cell, cellType, rowState, rowIndex); 
      if (cellType == DataControlCellType.DataCell) 
      { 
       WebControl button = (WebControl)cell.Controls[0]; 
       button.Attributes["onclick"] = String.Format("return confirm('{0}');", _confirmText); 
      } 
     } 
    } 
} 

Возможно ли это? Как вы можете видеть, я добавляю следующий код в свой класс DeleteButtonField.cs, но он не имел никакого эффекта: this.ImageUrl = "App_GlobalResources/Del.png";

Спасибо.

ответ

1

Давайте избавимся от идеи переопределить поле кнопки и перейти с помощью простого поля шаблона. Он правильно обработает сообщения назад и поднимет события GridView (RowCommand & RowDeleting). Надеюсь это поможет! =)

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


namespace MyExample.Web 
{ 
    public class MyDeleteButtonField : TemplateField 
    { 
     #region Properties 

     private string _ConfirmText = "Delete Me?"; 
     public string ConfirmText 
     { 
      get { return _ConfirmText; } 
      set { _ConfirmText = value; } 
     } 

     private string _ImageUrl = "~/Assets/Images/Buttons/flip.png"; 
     public string ImageUrl 
     { 
      get { return _ImageUrl; } 
      set { _ImageUrl = value; } 
     } 

     #endregion 

     #region Methods 

     public override bool Initialize(bool sortingEnabled, System.Web.UI.Control control) 
     { 
      base.ItemTemplate = new MyTemplate(this.ConfirmText, this.ImageUrl); 
      return base.Initialize(sortingEnabled, control); 
     } 

     #endregion 

     #region Template 

     public class MyTemplate : ITemplate 
     { 
      private string _ConfirmText; 
      private string _ImageUrl; 

      public MyTemplate(string confirmText, string imageUrl) 
      { 
       _ConfirmText = confirmText; 
       _ImageUrl = imageUrl; 
      } 

      void ITemplate.InstantiateIn(Control container) 
      { 
       ImageButton bt = new ImageButton(); 
       bt.CommandName = "Delete"; 
       bt.ImageUrl = _ImageUrl; 
       bt.ImageAlign = ImageAlign.AbsMiddle; 
       bt.AlternateText = "Delete Me"; 
       bt.OnClientClick = String.Format("return confirm('{0}');", _ConfirmText); 
       container.Controls.Add(bt); 

      } 
     } 

     #endregion 

    } 
} 
+0

@Brian, у меня есть проблема. Записи не удаляются, когда я нажимаю на изображение. Вы знаете, что могло пойти не так? –

+0

Марк, посмотрите на код выше. Должен заставить вас работать сейчас. Я должен придерживаться своих орудий, поскольку я изначально собирался написать для вас пример TemplateField. Он лучше справляется с задачами (postbacks и т. Д.). :) –

+0

@Brian, спасибо за это. Когда я запускаю это, веб-сервер ASP.NET Development разбивается! –

1

Марк, я думаю, что вы являетесь обычным классом очень, очень близко. Для класса ButtonField, чтобы отобразить изображение, вам нужно указать ImageUrl объект и введите ButtonType собственности ButtonType.Image.

Попробуйте обновить конструктор вашего DeleteButtonField класса для:

public DeleteButtonField() 
{ 
    this.CommandName = "Delete"; 
    this.Text = "Delete"; 
    this.ImageUrl = "App_GlobalResources/Del.png"; 
    this.ButtonType = ButtonType.Button; 
} 

В качестве альтернативы, можно задать эти настройки с помощью декларативного синтаксиса в .aspx странице:

<CustomControls:DeleteButtonField ConfirmText="Delete this record?" ImageUrl='...' ButtonType="Image" /> 

Happy Программирование!

+0

Скотт. Я получаю ту же проблему, что удаление не отправляется в базу данных. Я не думаю, что вызов метода DeleteMethod. Какие-нибудь дальнейшие идеи? –

+0

@Mark: ваш первоначальный вопрос заявил, что изображение кнопки «Удалить» не отображается. Но теперь ваш вопрос кажется немного другим - а именно, что удаление не работает. Итак, изображение кнопки удаления теперь отображается с моим ответом? –

+0

действительно изображение кнопки отображается, но удаление на самом деле ничего не удаляет. Без изображения удаляется работа. Немного странно, но мы здесь. –

Смежные вопросы