Пользовательская кнопка удаления GridView - PullRequest
1 голос
/ 17 марта 2010

Как настроить автоматически сгенерированную командную кнопку, например, Delete

Я хочу добавить подтверждение клиента при удалении, и в то же время я хочу, чтобы эта кнопка генерировалась при установке AutoGenerateDeleteButton="true". Возможно ли это?

Я могу добавить пользовательскую кнопку следующим образом:

<asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton runat="server" CommandName="Delete" OnClientClick="return confirm('Delete?')">Delete</asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>

, но он не будет автоматически локализован и не будет сгенерирован при установке AutoGenerateDeleteButton="true"!

Ответы [ 3 ]

2 голосов
/ 17 марта 2010

Я бы скорее рекомендовал использовать событие RowDataBound вместо события PreRender.

Там вы можете легко получить доступ к вашим элементам в определенной строке. (Я думаю, что решение, опубликованное Келси, может иметь проблемы с подкачкой страниц (возможно, просто в сочетании с ajax))

Присвойте кнопке Link ID и подпишитесь на событие RowDataBound.

  void gv_RowDataBound(Object sender, GridViewRowEventArgs e)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      LinkButton _foo = e.Row.FindControl("LINKBUTTONID") as LinkButton;
      if(_foo != null)
      {
       _foo.OnClientClick = "insert localized text here";
      }
    }
  }
0 голосов
/ 17 марта 2010

Во-первых, вам нужно создать файл / класс .vb, щелкнув правой кнопкой мыши на корневом файле на вкладке «Обозреватель решений» (я использую VWD). Выберите Добавить новый и выберите страницу класса. Он предложит создать папку App_Code, в которой будут находиться ваши общие классы. Назовите файл / класс как «DeleteButtonField.vb» и нажмите «ОК».

Затем он должен открыть новый файл .vb с именем DeleteButtonField, и вы можете скопировать и вставить или ввести код ниже. (Обратите внимание, что вы можете использовать Intellisense для завершения действительно длинного кода, который определяет защищенные переопределения Sub InitializeCell (........).)

Imports Microsoft.VisualBasic
Imports System
Imports System.Web.UI.WebControls

Namespace myControls
Public Class DeleteButtonField
  Inherits ButtonField
  Private _confirmText As String = "Delete This Record?"
  Public Property ConfirmText() As String
     Get
        Return _confirmText
     End Get
     Set(ByVal value As String)
        _confirmText = value
     End Set
  End Property
  Public Sub New()
     Me.CommandName = "Delete"
     Me.Text = "Delete"
  End Sub

  Public Overrides Sub InitializeCell(ByVal cell As System.Web.UI.WebControls.DataControlFieldCell, ByVal cellType As System.Web.UI.WebControl.DataControlCellType, ByVal rowState As System.Web.UI.WebControl.DataControlRowState, ByVal rowIndex As Integer)
     MyBase.InitializeCell(cell, cellType, rowState, rowIndex)
     If cellType = DataControlCellType.DataCell Then
        Dim button As WebControl = CType(cell.Controls(0), WebControl)
        button.Attributes("onclick") = String.Format("return confirm('{0}');", _confirmText)
     End If
 End Sub
End Class
End Namespace

Сохраните файл .vb. Затем на странице .aspx откройте страницу в исходном режиме и найдите определение GridView (т. Е. Теги. Вы можете выбрать, где вы хотите, чтобы кнопка «Удалить» появлялась: либо первая позиция, вторая или т. текстовую позицию, чтобы вы не изменили ни одно из определений и добавили следующее

<custom:DeleteButtonField ConfirmText="Are you sure that you want to delete this record?"></custom:DeleteButtonField>

Вам также необходимо добавить строку вверху страницы после <% @ Page ...> следующим образом

<%@ Register TagPrefix="custom" Namespace="myControls" %> Это также необходимо добавить на каждую страницу, где вы собираетесь использовать новую кнопку удаления в GridView. Может быть способ установить это как значение по умолчанию в web.config; На данном этапе моего обучения меня там нет.

Сохраните страницу .aspx и протестируйте. Теперь вы определили общий Sub (который определяет стандартную кнопку Delete и ее поведение), который вы можете присоединить к любому GridView в вашем приложении.

0 голосов
/ 17 марта 2010

Вы, вероятно, можете сделать это, реализовав событие PreRender для сетки.

Вот базовый код псевдо:

protected void yourGrid_PreRender(object sender, EventArgs e)
{
    GridView grd = (GridView)(sender);

    // iterate through all your rows and look for the button
    // make sure to add code to verify your rows, columns, and control bounds are valid
    for (int rowIndex = 0; rowIndex < grd.Rows.Count; rowIndex++)
    {
        LinkButton btn = grd.Rows[rowIndex].Cells[deleteButtonColumnIndex].Controls[0] as LinkButton;

        // Here you have access to the button so change it to do what you need.
        btn.OnClientClick = string.Format("return confirm('{0}?')", btn.Text);
    }
}

Также, если вы хотите, чтобы он запекся, вам, вероятно, потребуется расширить GridView и реализовать свой собственный код. Смотрите следующую ветку:

http://forums.asp.net/p/1396268/3011988.aspx#3011988

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...