自定义GridView删除按钮

时间:2010-03-16 21:38:01

标签: .net asp.net javascript gridview

如何自定义自动生成的命令按钮,例如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 个答案:

答案 0 :(得分:2)

我宁愿建议使用RowDataBound事件而不是PreRender事件。

在那里,您可以轻松访问特定行中的元素。 (我认为Kelsey发布的解决方案可能存在分页问题(可能只是与ajax结合使用))

为Linkbutton提供一个ID和subribe到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";
      }
    }
  }

答案 1 :(得分: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

答案 2 :(得分:0)

首先,您需要通过右键单击Solutions Explorer选项卡中的根文件来创建.vb文件/类(我使用VWD)。选择Add New,然后选择Class页面。它将提供创建App_Code文件夹,这是您的共享类所在的位置。将文件/类命名为“DeleteButtonField.vb”,然后单击“确定”。

然后应该打开一个名为DeleteButtonField的新.vb文件,您可以复制并粘贴或输入以下代码。 (注意,您可以使用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>

您还需要在&lt;%@ Page ...&gt;之后在页面顶部添加一行。如下

<%@ Register TagPrefix="custom" Namespace="myControls" %> 这也需要添加到您打算在GridView中使用新删除按钮的每个页面上。可能有一种方法可以将其设置为web.config中的默认值;在我学习的这个阶段,我不在那里。

保存.aspx页面并进行测试。您现在已经定义了一个公共Sub(它定义了一个标准的Delete按钮及其行为),您可以将其附加到应用程序中的任何GridView。