Solved

Repeater Control inside custom asp.net web control

Posted on 2003-12-11
2
1,470 Views
Last Modified: 2007-12-19
I have programmatically created a Repeater control inside an asp.net web control. I need a bit of help setting up the structure correctly. After hours of research, i basically came up with the following:

// code block below is all inside my CreateChildControls() method
==========================================
Repeater1.ID="Repeater1";
Repeater1.DataSource = dt;
Repeater1.DataBind();
                  
// set up TemplateBuilder to dynamically build ItemTemplate
TemplateBuilder rptrItem = new TemplateBuilder();
                  
// build content for ItemTemplate
string BuildHTML1 = "";
BuildHTML1 += "<tr>";
BuildHTML1 += "<td valign='top'>";
BuildHTML1 += "<table cellspacing='0' cellpadding='0' align='Center' border='1' BGCOLOR='#E9E9EE'";
BuildHTML1 += "<tr>";
BuildHTML1 += "<td width='100' align='center' valign='middle' nowrap>";
                  
// register BuildHTML1
rptrItem.AppendLiteralString(BuildHTML1);
                  
// construct ThumbButton (an ImageButton)
//ThumbButton.ID = "ThumbButton";
ThumbButton.ImageUrl = Repeater1.Items[3].ToString();
ThumbButton.AlternateText = Repeater1.Items[4].ToString();
ThumbButton.BorderWidth = 0;
ThumbButton.Command += new CommandEventHandler(BuildBrava);
ThumbButton.CommandName = Repeater1.Items[0].ToString();
ThumbButton.CommandArgument = Repeater1.Items[2].ToString();
                  
// register ThumbButton
Repeater1.ItemTemplate.InstantiateIn(ThumbButton);
                  
// add ThumbButton
Repeater1.Controls.Add(ThumbButton);

// register final HTML
rptrItem.AppendLiteralString("</td></tr></table></td></tr>");
Repeater1.ItemTemplate = rptrItem;
                  
// add Repeater1 as a control
Controls.Add(Repeater1);
==========================================

The 1st problem, right off the bat, is that all the "Repeater1.Items[3].ToString();" code is wrong. I can't figure out how to get the value of a chosen column of the "current" row of my DataTable (dt), so I can set properties of my ImageButton (ThumbButton).

so. . .I really need a bit of help with:
1- how do I grab the data values of the Repeater?
2- is my structure correct? i'm especially wondering whether the following 2 lines of code are right, and in the right place:

      Repeater1.ItemTemplate.InstantiateIn(ThumbButton);

and. . .

     Repeater1.Controls.Add(ThumbButton);

please help.
0
Comment
Question by:SweatCoder
2 Comments
 
LVL 2

Accepted Solution

by:
edwinugomez earned 500 total points
ID: 9930603
Hi.
Instead of creating the table and button in the CreateChildControls method, create them in the ItemCreated event of the repeater. On CreateChildControls  just create the repeater, add a handler to the itemcreated event and add it to the controls collection.

protected override void CreateChildControls() {
   Repeater Repeater1 = new Repeater();
   Repeater1.ID="Repeater1";
   Repeater1.DataSource = dt;
   Repeater1.ItemCreated += new RepeaterItemEventHandler(onItemCreated);
   Repeater1.DataBind();
   Controls.Add(Repeater1);
}

And the evend handler should be something like:
void onItemCreated(Object sender, RepeaterItemEventArgs e) {
   ImageButton ThumbButton  = new ImageButton();
   RepeaterItem MyItem  = e.Item;
   DataRowView CurrentDataRow  = (DataRowView)MyItem.DataItem;
   
   ThumbButton.ImageUrl = (String)CurrentDataRow.Row.ItemArray[1];
   ThumbButton.ID = "MyImageButton";
   ThumbButton.AlternateText =  (String)CurrentDataRow.Row.ItemArray[0];
   ThumbButton.BorderWidth = 0;
   ThumbButton.ImageUrl = "New Image";
   ThumbButton.Command += new CommandEventHandler(BuildBrava);
   
   Table MyTable = new Table();
   MyTable.CellPadding = 0;
   MyTable.CellSpacing = 0;
   MyTable.Rows.Add(new TableRow());
   MyTable.Rows[0].Cells.Add(new TableCell());
   MyTable.Rows[0].Cells[0].Controls.Add(ThumbButton);
   e.Item.Controls.Add(MyTable);
}

Hope it helps!
Edwin
0
 
LVL 11

Author Comment

by:SweatCoder
ID: 9931714
there is still a problem. everything compiles, but the Repeater is not rendering. no errors, just doesn't render.

since my class must derive from WebPart (it's a MS Sharepoint thing) rather than WebControl or Control, things work a bit differently. One difference is that NOTHING will render/ouput unless it is defined inside the mandatory override method "RenderWebPart".
 
after getting your code, i tried to render ThumbButton separately in the RenderWebPart method, but that just created a broken image link above the FileInput control. when i leave it out, i get nothing. The RenderWebPart is supposed to be equivalent to the "Render" method of the Control class. In a standard environment in which Render is used, you don't *have* to put anything in Render, you can make the controls render from within CreateChildControls, but that's not the case in this environment.
 
I have a FileInput control and a button control, both of which render just fine (see attached image). It's when I get to the Repeater part that i have the trouble.
 
here's my code at this point:

void onItemCreated(Object sender, RepeaterItemEventArgs e) {
      ImageButton ThumbButton  = new ImageButton();
      RepeaterItem MyItem  = e.Item;
      DataRowView CurrentDataRow  = (DataRowView)MyItem.DataItem;
                  
      ThumbButton.ImageUrl = (String)CurrentDataRow.Row.ItemArray[3];
      ThumbButton.ID = "ThumbButton1";
      ThumbButton.AlternateText =  (String)CurrentDataRow.Row.ItemArray[4];
      ThumbButton.BorderWidth = 0;
      ThumbButton.Command += new CommandEventHandler(BuildBrava);

      Table MyTable = new Table();
      MyTable.CellPadding = 0;
      MyTable.CellSpacing = 0;
      MyTable.Rows.Add(new TableRow());
      MyTable.Rows[0].Cells.Add(new TableCell());
      MyTable.Rows[0].Cells[0].Controls.Add(ThumbButton);
      e.Item.Controls.Add(MyTable);
}

protected override void CreateChildControls(){
                  
      BuildFileList("CreateChildControls"); // build recordset
      Controls.Clear(); // clear controls
                  
      // declaration of UpLoader (INPUT-SUBMIT)
      UpLoader.ID = "UpLoader";
      UpLoader.EnableViewState = false;
      Controls.Add(UpLoader);

      // declaration of InputSubmit (SUBMIT BUTTON)
      InputSubmit.ID = "InputSubmit";
      InputSubmit.Value="Upload";
      InputSubmit.EnableViewState = false;
      InputSubmit.ServerClick += new System.EventHandler(Upload_Click);
      Controls.Add(InputSubmit);

      // declaration of Repeater1            
      Repeater Repeater1 = new Repeater();
      Repeater1.ID="Repeater1";
      Repeater1.DataSource = dt;
      Repeater1.ItemCreated += new RepeaterItemEventHandler(onItemCreated);
      Repeater1.DataBind();
      Controls.Add(Repeater1);
}

protected override void RenderWebPart(HtmlTextWriter output){
      EnsureChildControls(); // must call this first

      // stylesheet definitions
      output.Write("<STYLE>");
      output.Write("BODY,TD {FONT-FAMILY:" + IGCFont + ";COLOR:" + IGCFontColor + ";FONT-SIZE:" + IGCFontSize + "pt;}");
      output.Write("</STYLE>");

      // begin table defs
      output.Write("<table BORDER='0'>");
      output.Write("<tr>");
      output.Write("<td valign='top' nowrap>");
      output.Write("<table cellspacing='0' cellpadding='0' border='0' width='100%' bordercolor='#A09DB3'>");
      output.Write("<tr>");
      output.Write("<td nowrap>");
            
      // render UpLoader
      UpLoader.RenderControl(output);
                  
      // render InputSubmit
      InputSubmit.RenderControl(output);
      
      // end html for uploader controls
      output.Write("</td>");
      output.Write("</tr>");      

               //===================================
      // render Repeater1
      Repeater1.RenderControl(output);
      //=====================================
                  
      //ThumbButton.RenderControl(output);
                  
      output.Write("</table>");
      output.Write("</td>");
      // end outer table def for thumbnails
            
      // begin cell for Brava DIV
      output.Write("<td valign='top'>");

      //===================================
      // render BravaDIV
      BravaDIV.RenderControl(output);
      //=====================================
                // end cell for Brava DIV
      output.Write("</td>");
      output.Write("</tr>");
      output.Write("</table>");
      // end outermost table
}

. . .the input/submit stuff renders and works, but the Repeater (and controls inside repeater) is getting lost in deep space somehow. no rendering, nothing visible.
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

823 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question