• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1191
  • Last Modified:

How to fire ItemCommand Event on programatically added Datalist

Hi,
I have a user control with a datalist and a textbox. I programatically added the user control in my page_load. The idea is when i click on a button in the datalist, the textbox will reflect the id on the selected datalist item.

The problem is, i can't seem to get the itemcommand events to be fired. Please advise.
.asc.vb
========
 
Partial Class UserCtrl
    Inherits System.Web.UI.UserControl
 
    Private _username As String
    Public Event getItemOnCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
 
    Protected Sub Datalist1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
 
        If e.CommandName = "getID" Then
            TextBox1.Text = "You have clicked on the datalist button"
        End If
 
        RaiseEvent getItemOnCommand(Me, e)
 
    End Sub
 
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 
        If Not Page.IsPostBack Then
            'Nothing fancy, just populating the datalist with rows.
            Dim dt As New DataTable
            Dim dr As DataRow
            Dim dc As DataColumn
 
            dc = New DataColumn
            dc.ColumnName = "id"
            dt.Columns.Add(dc)
            dc = New DataColumn
            dc.ColumnName = "name"
            dt.Columns.Add(dc)
 
            dr = dt.NewRow
            dr("id") = 1
            dr("name") = "andy"
            dt.Rows.Add(dr)
 
            dr = dt.NewRow
            dr("id") = 2
            dr("name") = "ethan"
            dt.Rows.Add(dr)
 
            dr = dt.NewRow
            dr("id") = 3
            dr("name") = "Matt"
            dt.Rows.Add(dr)
 
            Datalist1.DataSource = dt
            Datalist1.DataBind()
        End If
 
    End Sub
 
 
.asc
============
<%@ Control Language="VB" AutoEventWireup="true" CodeFile="UserCtrl.ascx.vb" Inherits="UserCtrl" %>
 
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
 
<asp:DataList ID="Datalist1" runat="server" 
        DataKeyField="id" 
        RepeatColumns = "3">
<HeaderTemplate>
    <strong>Selection Table</strong>
</HeaderTemplate>
<ItemTemplate>
    ID: <%#Eval("id")%>
    <br />
    Name: <%#Eval("name")%>
    <br />
    <asp:Button runat="server" CommandName="getID" Text="Get ID" CommandArgument='<%#Eval("id")%>' />
    <br /><br />
</ItemTemplate>
</asp:DataList>
 
.aspx.vb
============
 
Imports System.Data
Imports System.Collections.Generic
 
Partial Class Default4
    Inherits System.Web.UI.Page
 
    Private Sub UserControlDatalist_getItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
 
        MsgBox("this is user control")
        Dim dummy As UserCtrl = sender
        Dim txt As TextBox = dummy.FindControl("TextBox1")
 
        Response.Write(txt.Text)
 
    End Sub
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
 
        Dim userCtrl As UserCtrl = LoadControl("UserCtrl.ascx")
 
        PlaceHolder1.Controls.Add(userCtrl)
 
        AddHandler userCtrl.getItemOnCommand, AddressOf UserControlDatalist_getItemCommand
 
    End Sub
 
 
End Class
 
.aspx
=======
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default4.aspx.vb" Inherits="Default4" %>
<%@ Register TagPrefix="My" TagName="UserCtrl" Src="UserCtrl.ascx" %> 
 
<!--Now we can access the UserInfoBoxControl class like if it were a regular class, 
which also means that we can typecast the UserControl returned by the LoadControl method to this type-->
<%@ Reference Control="UserCtrl.ascx" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder runat="server" ID="ph1" /><br />
        <asp:PlaceHolder runat="server" ID="ph2" />
        <asp:Button runat="server" ID="btnAddBtn" Text="Add Button" CommandName="Button" /> 
        <asp:Button runat="server" ID="btnAddText" Text="Add Text" CommandName="TextBox" />
        <asp:Button runat="server" ID="btnAddDataList" Text="Add DataList" CommandName="DataList" />
    </div>
    <div>
    
    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
    
    </div>
    </form>
</body>
</html>

Open in new window

0
tangteng78
Asked:
tangteng78
  • 3
  • 3
1 Solution
 
Anurag AgarwalPython DeveloperCommented:
Have you registered the Datalist1.ItemCommand on UserCtrl.ascx to call your function Datalist1_ItemCommand??
 
Anurag
0
 
tangteng78Author Commented:
From the code snippet attached i did this:
     Protected Sub Datalist1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)

        If e.CommandName = "getID" Then
            TextBox1.Text = "You have clicked on the datalist button"
        End If

        RaiseEvent getItemOnCommand(Me, e)

    End Sub

Not sure if that's what you meant by register? If it's not, can you share with me how to register the events?
 
0
 
Anurag AgarwalPython DeveloperCommented:
On control UserCtrl.ascx you have to register the ItemCommand like
AddHandler userCtrl.ItemCommand, AddressOf Datalist1_ItemCommand
check whether you have already done that if not then do it.
 
Anurag
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
tangteng78Author Commented:
Added in in the page_load in the ascx.vb. Stil the same, not working.

PS: I created a separate user control and replace the datalist with just a button. And it works. Seems to me that the datalist just not working with the same  button implementation

Please advise.


0
 
tangteng78Author Commented:
Well, i finally able to get it to work. I added in the "Handles Datalist1.ItemCommand" to the Sub Datalist1_ItemCommand in the asc.vb.

But my question is, if i do the same on the Button1_click event, the button will be fired twice. I have to commented out the "Handles Button1.Click" for it to work correctly (fire only 1 time).

Any explaination?

    Protected Sub Datalist1_ItemCommand1(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles Datalist1.ItemCommand
        _username = e.CommandName.ToString
        If e.CommandName = "getID" Then
            'MsgBox(e.CommandArgument.ToString)
            TextBox1.Text = "You have clicked on the datalist button" + e.CommandArgument.ToString
        End If

        RaiseEvent getItemOnCommand(Me, e)
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) ' Handles Button1.Click
        _username = TextBox1.Text
        RaiseEvent getClick(Me, e)
    End Sub
0
 
Anurag AgarwalPython DeveloperCommented:
check your designer.cs file one handler should already added in that, because of that this event is fired twice.
 
Anurag
0

Featured Post

[Webinar] Database Backup and Recovery

Does your company store data on premises, off site, in the cloud, or a combination of these? If you answered “yes”, you need a data backup recovery plan that fits each and every platform. Watch now as as Percona teaches us how to build agile data backup recovery plan.

  • 3
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now