2010-03-16 3 views
1

Как настроить автоматическую сгенерированную командную кнопку, например. Delete?Пользовательская кнопка удаления GridView

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

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

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

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

ответ

0

Возможно, вы можете сделать это, выполнив событие 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

+0

@abatishchev просто следя за собой, вы когда-нибудь получали это? – Kelsey

+0

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

2

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

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

Дайте LinkButton идентификатор и подписку на событие 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

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

Затем он должен открыть новый .vb-файл с именем DeleteButtonField, и вы можете скопировать и вставить или ввести код ниже. (Обратите внимание, что вы можете использовать Intellisense, чтобы закончить очень долго кусок кода, который определяет Защищенные Overrides 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" %> Это также должно быть добавлено на каждой странице, где вы собираетесь с помощью новой кнопки Delete в GridView Там может быть способ установить это по умолчанию в web.config,. Я не Ther на этом этапе моего обучения.

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