Linking events from controls, when the controls have been created - DOTNET

This is a discussion on Linking events from controls, when the controls have been created - DOTNET ; I've a situation where I'm creating controls programatically. I'm programatically creating table cells and rows. I've got an array of data, and I want to format the data on screen in rows of 4. I get my array, calculate how ...

+ Reply to Thread
Results 1 to 4 of 4

Linking events from controls, when the controls have been created

  1. Default Linking events from controls, when the controls have been created

    I've a situation where I'm creating controls programatically. I'm
    programatically creating table cells and rows. I've got an array of data,
    and I want to format the data on screen in rows of 4. I get my array,
    calculate how many complete rows I need. Then for each of the complete rows,
    I format a cell for the data in that array element. When I've completed a
    row, I add it to my table. If I have a remainder, I do that at the end.

    This works very well. However, I want users to be able to select one of the
    images I'm showing by clicking on it. Normally, I would do this by
    <asp:Image ID="myImage" runat="server" OnClick="myImage_Click"/>
    and I would put the code into
    protected void myImageClick(object sender, EventArgs e)
    {
    Code Here
    }

    However, because I'm creating the ImageButton controls programatically, I
    can't quite get an event wired in. I've created event handlers, but I think
    that because each ImageButton class in created in FormatCell, then they are
    out of scope in a postback. Does anyone have a way for me to reliably wire
    an event handler into a programatically created control?




    The code is below

    protected void Page_Load(object sender, EventArgs e)
    {
    int typesPerRow = 4;
    if (!IsPostBack)
    {

    PointType[] types = PointSystem.GetPointTypes();
    TableRow tr;

    //Display the point types, four in a row.
    int rows = types.Length / typesPerRow;
    int remainder = types.Length % typesPerRow;
    for (int i = 0; i < rows; i++)
    {
    tr = new TableRow();
    for (int j = 0; j < typesPerRow; j++)
    {
    tr.Cells.Add(FormatCell(types[counter]));
    }
    emailPointTable.Rows.Add(tr);
    }

    //Do the last (partial) row
    if (remainder != 0)
    {
    tr = new TableRow();
    for (int j = 0; j < remainder; j++)
    {
    tr.Cells.Add(FormatCell(types[counter]));
    }
    emailPointTable.Rows.Add(tr);
    }
    }


    private TableCell FormatCell(PointType t)
    {
    ImageButtton pointPic;
    TableCell cell;
    LinkButton selectme;

    cell = new TableCell();
    cell.SkinID = "skinCell";

    pointPic = new ImageButton();
    pointPic.Click += new ImageClickEventHandler(this.pointTypeSelected);
    pointPic.SkinID = "skinImage";
    pointPic.ImageUrl = t.ImageLarge;
    pointPic.Height = 128;
    pointPic.Width = 128;

    selectme = new LinkButton();
    selectme.Text = t.Name;
    selectme.CommandName = "SelectPointType";

    cell.Controls.Add(pointPic);
    cell.Controls.Add(new LiteralControl("<br/>"));
    cell.Controls.Add(selectme);

    return cell;
    }

  2. Default Re: Linking events from controls, when the controls have been created

    when you create the control just add the handler

    myImage.OnClick += new ImageClickEventHandler(myImageClick);

    to get the postback event, you need to recreate the controls (with the
    same id's) in OnInit and assign the handlers


    -- bruce (sqlwork.com)



    rival@newsgroups.nospam wrote:
    > I've a situation where I'm creating controls programatically. I'm
    > programatically creating table cells and rows. I've got an array of data,
    > and I want to format the data on screen in rows of 4. I get my array,
    > calculate how many complete rows I need. Then for each of the complete rows,
    > I format a cell for the data in that array element. When I've completed a
    > row, I add it to my table. If I have a remainder, I do that at the end.
    >
    > This works very well. However, I want users to be able to select one of the
    > images I'm showing by clicking on it. Normally, I would do this by
    > <asp:Image ID="myImage" runat="server" OnClick="myImage_Click"/>
    > and I would put the code into
    > protected void myImageClick(object sender, EventArgs e)
    > {
    > Code Here
    > }
    >
    > However, because I'm creating the ImageButton controls programatically, I
    > can't quite get an event wired in. I've created event handlers, but I think
    > that because each ImageButton class in created in FormatCell, then they are
    > out of scope in a postback. Does anyone have a way for me to reliably wire
    > an event handler into a programatically created control?
    >
    >
    >
    >
    > The code is below
    >
    > protected void Page_Load(object sender, EventArgs e)
    > {
    > int typesPerRow = 4;
    > if (!IsPostBack)
    > {
    >
    > PointType[] types = PointSystem.GetPointTypes();
    > TableRow tr;
    >
    > //Display the point types, four in a row.
    > int rows = types.Length / typesPerRow;
    > int remainder = types.Length % typesPerRow;
    > for (int i = 0; i < rows; i++)
    > {
    > tr = new TableRow();
    > for (int j = 0; j < typesPerRow; j++)
    > {
    > tr.Cells.Add(FormatCell(types[counter]));
    > }
    > emailPointTable.Rows.Add(tr);
    > }
    >
    > //Do the last (partial) row
    > if (remainder != 0)
    > {
    > tr = new TableRow();
    > for (int j = 0; j < remainder; j++)
    > {
    > tr.Cells.Add(FormatCell(types[counter]));
    > }
    > emailPointTable.Rows.Add(tr);
    > }
    > }
    >
    >
    > private TableCell FormatCell(PointType t)
    > {
    > ImageButtton pointPic;
    > TableCell cell;
    > LinkButton selectme;
    >
    > cell = new TableCell();
    > cell.SkinID = "skinCell";
    >
    > pointPic = new ImageButton();
    > pointPic.Click += new ImageClickEventHandler(this.pointTypeSelected);
    > pointPic.SkinID = "skinImage";
    > pointPic.ImageUrl = t.ImageLarge;
    > pointPic.Height = 128;
    > pointPic.Width = 128;
    >
    > selectme = new LinkButton();
    > selectme.Text = t.Name;
    > selectme.CommandName = "SelectPointType";
    >
    > cell.Controls.Add(pointPic);
    > cell.Controls.Add(new LiteralControl("<br/>"));
    > cell.Controls.Add(selectme);
    >
    > return cell;
    > }


  3. Default Re: Linking events from controls, when the controls have been created

    Hi rival

    > However, because I'm creating the ImageButton controls programatically, I
    > can't quite get an event wired in. I've created event handlers, but I
    > think
    > that because each ImageButton class in created in FormatCell, then they
    > are
    > out of scope in a postback. Does anyone have a way for me to reliably
    > wire
    > an event handler into a programatically created control?

    you have to execute your code on every time, postback or not.
    that means, place your code outside of if(!this.IsPostBack), then that
    should work fine.

    --
    Gruss, Peter Bucher
    Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET



  4. Default Re: Linking events from controls, when the controls have been crea

    Thanks for this - firstly, Bruce - I'd already got the event linked in as you
    described. "you need to recreate the controls (with the
    same id's) in OnInit and assign the handlers" was the issue. I didn't want
    to do a hundred object declarations in case I need the object! I think you
    are driving at the same thing Peter has written below.
    "you have to execute your code on every time, postback or not"

    I've changed my Page_Load to this:
    if (!IsPostBack)
    {
    emailPointTable.Visible = true;
    }
    else
    {
    emailPointTable.Visible = false;
    }
    PointType[] types = PointSystem.GetPointTypes();
    TableRow tr;

    //Display the point types, three in a row.
    int rows = types.Length / typesPerRow;
    int remainder = types.Length % typesPerRow;
    int counter = 0;
    for (int i = 0; i < rows; i++)
    {
    tr = new TableRow();
    for (int j = 0; j < typesPerRow; j++)
    {
    tr.Cells.Add(FormatCell(types[counter]));
    counter++;
    }
    emailPointTable.Rows.Add(tr);
    }

    //Do the last (partial) row
    if (remainder != 0)
    {
    tr = new TableRow();
    for (int j = 0; j < remainder; j++)
    {
    tr.Cells.Add(FormatCell(types[counter]));
    counter++;
    }
    emailPointTable.Rows.Add(tr);
    }

    So if I'm posting back, I just don't render the table. And it works!
    Fantastic help from both Bruce and Peter

    Thanks again






    "Peter Bucher [MVP]" wrote:

    > Hi rival
    >
    > > However, because I'm creating the ImageButton controls programatically, I
    > > can't quite get an event wired in. I've created event handlers, but I
    > > think
    > > that because each ImageButton class in created in FormatCell, then they
    > > are
    > > out of scope in a postback. Does anyone have a way for me to reliably
    > > wire
    > > an event handler into a programatically created control?

    > you have to execute your code on every time, postback or not.
    > that means, place your code outside of if(!this.IsPostBack), then that
    > should work fine.
    >
    > --
    > Gruss, Peter Bucher
    > Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland
    > http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    > http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET
    >
    >
    >


+ Reply to Thread

Similar Threads

  1. dynamically adding controls with events (but events are not firing)
    By Application Development in forum DOTNET
    Replies: 2
    Last Post: 11-13-2007, 01:33 AM
  2. Dynamically created controls not refreshed
    By Application Development in forum DOTNET
    Replies: 2
    Last Post: 10-19-2007, 01:20 PM
  3. Question on Events for web controls in C#
    By Application Development in forum DOTNET
    Replies: 1
    Last Post: 09-16-2007, 07:26 PM
  4. Controls.Count, Controls.IsSynchronized, and Controls.SyncRoot
    By Application Development in forum DOTNET
    Replies: 4
    Last Post: 09-04-2007, 10:27 PM
  5. Populating database in controls created at runtime
    By Application Development in forum basic.visual
    Replies: 0
    Last Post: 03-17-2006, 06:21 AM