SweatCoder
asked on
Repeater Control inside custom asp.net web control
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.AppendLiteralStri ng(BuildHT ML1);
// construct ThumbButton (an ImageButton)
//ThumbButton.ID = "ThumbButton";
ThumbButton.ImageUrl = Repeater1.Items[3].ToStrin g();
ThumbButton.AlternateText = Repeater1.Items[4].ToStrin g();
ThumbButton.BorderWidth = 0;
ThumbButton.Command += new CommandEventHandler(BuildB rava);
ThumbButton.CommandName = Repeater1.Items[0].ToStrin g();
ThumbButton.CommandArgumen t = Repeater1.Items[2].ToStrin g();
// register ThumbButton
Repeater1.ItemTemplate.Ins tantiateIn (ThumbButt on);
// add ThumbButton
Repeater1.Controls.Add(Thu mbButton);
// register final HTML
rptrItem.AppendLiteralStri ng("</td>< /tr></tabl e></td></t r>");
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].ToStri ng();" 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.Ins tantiateIn (ThumbButt on);
and. . .
Repeater1.Controls.Add(Thu mbButton);
please help.
// 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.AppendLiteralStri
// construct ThumbButton (an ImageButton)
//ThumbButton.ID = "ThumbButton";
ThumbButton.ImageUrl = Repeater1.Items[3].ToStrin
ThumbButton.AlternateText = Repeater1.Items[4].ToStrin
ThumbButton.BorderWidth = 0;
ThumbButton.Command += new CommandEventHandler(BuildB
ThumbButton.CommandName = Repeater1.Items[0].ToStrin
ThumbButton.CommandArgumen
// register ThumbButton
Repeater1.ItemTemplate.Ins
// add ThumbButton
Repeater1.Controls.Add(Thu
// register final HTML
rptrItem.AppendLiteralStri
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].ToStri
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.Ins
and. . .
Repeater1.Controls.Add(Thu
please help.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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.DataIt
ThumbButton.ImageUrl = (String)CurrentDataRow.Row
ThumbButton.ID = "ThumbButton1";
ThumbButton.AlternateText = (String)CurrentDataRow.Row
ThumbButton.BorderWidth = 0;
ThumbButton.Command += new CommandEventHandler(BuildB
Table MyTable = new Table();
MyTable.CellPadding = 0;
MyTable.CellSpacing = 0;
MyTable.Rows.Add(new TableRow());
MyTable.Rows[0].Cells.Add(
MyTable.Rows[0].Cells[0].C
e.Item.Controls.Add(MyTabl
}
protected override void CreateChildControls(){
BuildFileList("CreateChild
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.EnableViewStat
InputSubmit.ServerClick += new System.EventHandler(Upload
Controls.Add(InputSubmit);
// declaration of Repeater1
Repeater Repeater1 = new Repeater();
Repeater1.ID="Repeater1";
Repeater1.DataSource = dt;
Repeater1.ItemCreated += new RepeaterItemEventHandler(o
Repeater1.DataBind();
Controls.Add(Repeater1);
}
protected override void RenderWebPart(HtmlTextWrit
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(out
// render InputSubmit
InputSubmit.RenderControl(
// end html for uploader controls
output.Write("</td>");
output.Write("</tr>");
//========================
// render Repeater1
Repeater1.RenderControl(ou
//========================
//ThumbButton.RenderContro
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(out
//========================
// 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.