Image Button inside a template column - Handling The Click Event

Discussion in 'ASP .Net Web Controls' started by KJ, Aug 7, 2003.

  1. KJ

    KJ Guest

    I have been searching for 2 days on how to handle a imagebutton click
    event inside a template column on a datagrid control. Does anyone know
    how to do it?

    The ItemClick Event does not fire when I click the image button
    therefore the event never gets raised to the webform. Please Help

    My code is below





    Public Class DataGridTemplate
    Implements ITemplate
    Dim templateType As ListItemType
    Dim columnName As String

    Event ItemImageClick(ByVal source As Object, ByVal e As
    System.Web.UI.ImageClickEventArgs)

    Sub New(ByVal type As ListItemType, ByVal ColName As String)
    templateType = type
    columnName = ColName
    End Sub

    Sub InstantiateIn(ByVal container As Control) _
    Implements ITemplate.InstantiateIn
    ib = New ImageButton()

    ib.ImageUrl = Select.gif"
    ib.ToolTip = "Select Item"
    ib.ImageAlign = ImageAlign.AbsBottom
    ib.CommandName = "Select"
    AddHandler ib.Click, AddressOf ItemClick
    container.Controls.Add(ib)

    End Sub

    Public Sub ItemClick(ByVal sender As Object, _
    ByVal e As
    System.Web.UI.ImageClickEventArgs)
    RaiseEvent ItemImageClick(Me, e)

    End Sub
     
    KJ, Aug 7, 2003
    #1
    1. Advertising

  2. KJ

    Severin Guest

    On an ASPX page, only PAGE level controls have events...

    When you place any other <asp:> control inside a datagrid, it is no longer a
    PAGE level control, it is now a CHILD of the datagrid.

    So... You must use the DataGrid event 'ItemCommand' for all events that can
    be raised from internal controls.
    Using the ImageButton CommandArguement and CommandName to determine which
    imagebutton was cliked.

    Usually you would put the primaryKey of the datatable in the CommandArgument
    property, and then any string for the CommandName property

    example below:
    Private Sub DataGrid1_ItemCommand(ByVal source As Object, ByVal e As
    System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
    DataGrid1.ItemCommand

    If e.CommandName = [property of ImageButton] Then

    Dim primaryKey as Integer = CInt(e.CommandArguement)

    ' Do logic or database command for image clicked event

    End If

    End Sub

    Severin


    "KJ" <> wrote in message
    news:...
    > I have been searching for 2 days on how to handle a imagebutton click
    > event inside a template column on a datagrid control. Does anyone know
    > how to do it?
    >
    > The ItemClick Event does not fire when I click the image button
    > therefore the event never gets raised to the webform. Please Help
    >
    > My code is below
    >
    >
    >
    >
    >
    > Public Class DataGridTemplate
    > Implements ITemplate
    > Dim templateType As ListItemType
    > Dim columnName As String
    >
    > Event ItemImageClick(ByVal source As Object, ByVal e As
    > System.Web.UI.ImageClickEventArgs)
    >
    > Sub New(ByVal type As ListItemType, ByVal ColName As String)
    > templateType = type
    > columnName = ColName
    > End Sub
    >
    > Sub InstantiateIn(ByVal container As Control) _
    > Implements ITemplate.InstantiateIn
    > ib = New ImageButton()
    >
    > ib.ImageUrl = Select.gif"
    > ib.ToolTip = "Select Item"
    > ib.ImageAlign = ImageAlign.AbsBottom
    > ib.CommandName = "Select"
    > AddHandler ib.Click, AddressOf ItemClick
    > container.Controls.Add(ib)
    >
    > End Sub
    >
    > Public Sub ItemClick(ByVal sender As Object, _
    > ByVal e As
    > System.Web.UI.ImageClickEventArgs)
    > RaiseEvent ItemImageClick(Me, e)
    >
    > End Sub
     
    Severin, Aug 7, 2003
    #2
    1. Advertising

  3. KJ

    Kyle Johnson Guest

    My dgItemClick Event that handles dgItems.ItemCommand is not firing.
    Does anyone know why?

    Below is the code:



    Public Class ABC
    Inherits System.Web.UI.WebControls.WebControl

    Dim dgItems As New DataGrid()
    Dim x As New TemplateColumn()
    Dim y As DataGridColumn()
    Dim s As New BoundColumn()
    Dim k As New BoundColumn()
    Dim l As New BoundColumn()
    Dim e As New BoundColumn()
    Dim strsql As String

    Protected Overrides Sub CreateChildControls()

    dgItems.CellPadding = 2
    dgItems.CellSpacing = 0
    'dgItems.Width = 550px
    ' dgItems.BorderWidth = 1
    dgItems.BorderColor = ColorTranslator.FromHtml("Black")
    dgItems.AutoGenerateColumns = False
    dgItems.ForeColor = ColorTranslator.FromHtml("Black")
    ' dgItems.Font.Size = 8
    dgItems.Font.Name = "Arial"

    ' x.ItemStyle.BackColor = ColorTranslator.FromHtml("#FFF778")
    x.ItemStyle.HorizontalAlign = HorizontalAlign.Center
    s.HeaderText = "hasccp"
    s.DataField = "hasccp"

    k.HeaderText = "Number"
    k.DataField = "Number"

    l.HeaderText = "Type"
    l.DataField = "Type"

    e.HeaderText = "Name"
    e.DataField = "Name"

    x.ItemTemplate = New DataGridTemplate(ListItemType.Item,
    "Column1")
    dgItems.Columns.AddAt(0, x)
    dgItems.Columns.AddAt(1, s)
    dgItems.Columns.AddAt(2, k)
    dgItems.Columns.AddAt(3, l)
    dgItems.Columns.AddAt(4, e)
    dgItems.DataSource = RcpDS.Tables("Recipes")
    dgItems.DataBind()
    dgItems.EnableViewState = True
    Controls.Add(dgItems)
    'Controls.Add(New LiteralControl("</div>"))
    AddHandler dgItems.ItemCommand, AddressOf dgItemClick

    End Sub
    Public Sub dgItemClick(ByVal sender As Object, _
    ByVal e As
    System.Web.UI.WebControls.DataGridCommandEventArgs)
    If e.CommandName = "Select" Then
    End If
    End Sub

    End Class

    *** Sent via Developersdex http://www.developersdex.com ***
    Don't just participate in USENET...get rewarded for it!
     
    Kyle Johnson, Aug 7, 2003
    #3
  4. KJ

    KJ Guest

    Re: Image Button inside a template column - Handling The Click Event - Solution!

    Through much searching.


    I found the solution. It was not as clearing spelled out either.

    One event that does always fire is the datagrid DataBinding event.


    1. Inside the databinding event. You have to call EnsureChildControls
    method. Ex.

    Private Sub datagrid1_DataBinding(ByVal sender As Object, ByVal e As
    System.EventArgs) Handles dgItems.DataBinding
    EnsureChildControls()
    End Sub

    2. In the Page_Load of your web form this is where you call your
    public method to bind the data to your datagrid. In your control
    create a method that just creates the dataset, sets it to the
    datasource of the grid and then binds it. Ex.


    Public Sub BindDataGrid()
    Dim sqlconn As New SqlClient.SqlConnection()
    sqlconn.ConnectionString = "data source="
    sqlconn.Open()

    strsql = "select * from google"

    Dim sqlCommand As New SqlClient.SqlCommand(strsql, sqlconn)
    sqlCommand.CommandType = CommandType.Text

    Dim rcpDA As SqlClient.SqlDataAdapter = New
    SqlClient.SqlDataAdapter()
    rcpDA.SelectCommand = sqlCommand

    Dim RcpDS As DataSet = New DataSet()
    rcpDA.Fill(RcpDS, "Searches")
    datagrid1.DataSource = RcpDS.Tables("Searches")
    datagrid1.DataBind()

    End Sub


    Call this from the Page_Load of the webform.

    All your events should fire now. Hope this helps. Sorry I cannot give
    a technical explaination for this but maybe someone will reply with
    one.
     
    KJ, Aug 8, 2003
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page