呈现控件时该重载哪种方法呢?

lyb_abiandbel 2006-05-10 09:36:42
我注意到,在呈现控件时,有的重载了Render方法,有的重载了RenderContents方法,
这两者之间有什么区别呢?

另外CreateChildControls方法和AddAttributesToRender和上面两个方法有什么联系吗?
...全文
232 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyb_abiandbel 2006-05-13
  • 打赏
  • 举报
回复
to:shalen520(Love will keep us alive)

好象行了,我试了,我把控件删了,然后又把<%@ Register TagPrefix="cc2" Namespace="myWebControl" Assembly="myWebControl" %>删了,

然后再加,就可以了.

然后我再加,显示<%@ Register TagPrefix="login" Namespace="myWebControl" Assembly="myWebControl" %>

又把这句话删除了,再加还是正常.

试了多次,也正常了,怎么回事呢?
lyb_abiandbel 2006-05-12
  • 打赏
  • 举报
回复
我想为我的控件加上TagPrefix,

我加入以下代码:
#region Assembly
[assembly: TagPrefix("myWebControl", "Login")]
#endregion

加入了using 和命名空间之间。
把以下代码:
[DefaultProperty("Text"),
ToolboxData("<{0}:MyLoginControl runat=server></{0}:MyLoginControl>")]
加在类名称之前。

但是当我把编译好的控件放入页面时,打开代码,仍然显示的是:
<%@ Register TagPrefix="cc2" Namespace="myWebControl" Assembly="myWebControl" %>

并没有显示:
<%@ Register TagPrefix="Login" Namespace="myWebControl" Assembly="myWebControl" %>

请问我的操作中有什么问题吗?有错误吗?
shalen520 2006-05-12
  • 打赏
  • 举报
回复
删掉这行,<%@ Register TagPrefix="cc2" Namespace="myWebControl" Assembly="myWebControl" %>

再加试试

lowtemper 2006-05-12
  • 打赏
  • 举报
回复
复合空间才会用到CreateChildControls,一般用render,但是要加clientScript的时候就要重载OnPreRender
lyb_abiandbel 2006-05-11
  • 打赏
  • 举报
回复
我又遇到了另外一个问题:

我想设置label的值,我加了属性:
private string m_lnameText;
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string lnameText
{
get
{
this.EnsureChildControls();
return m_lnameText;
}

set
{
//this.EnsureChildControls();
m_lnameText = value;
}
}
但是,我即使在属性面板里面设置lnameText的值,页面显示出来的时候,lable却没有,
我想问题可能是EnsureChildControls引起的,先执行EnsureChildControls,然后跳到CreateChildControls方法。这时,CreateChildControls方法中lname.Text=this.lnameText;
this.lnameText=null. 我把set中this.EnsureChildControls();注释掉即可正常显示。

但是奇怪的是,msdn中也是这样写的,为什么他没有问题呢!
lyb_abiandbel 2006-05-11
  • 打赏
  • 举报
回复
To:斑竹

你的解释很清楚,谢谢了。

我用同一控件分别重载Render方法和RenderContents方法。生成的HTML如下:

<table>
<tr>
<td><span>name:</span></td><td><input name="MyCompositeControl1:_ctl2" type="text" /></td>
</tr><tr>
<td><span>password:</span></td><td><input name="MyCompositeControl1:_ctl3" type="text" /></td>
</tr><tr>
<td><input type="submit" name="MyCompositeControl1:_ctl4" value="Submit" /></td>
</tr>
</table>


<span id="MyCompositeControl1" style="height:24px;width:96px;Z-INDEX: 101; LEFT: 264px; POSITION: absolute; TOP: 440px"><table>
<tr>
<td><span>name:</span></td><td><input name="MyCompositeControl1:_ctl2" type="text" /></td>
</tr><tr>
<td><span>password:</span></td><td><input name="MyCompositeControl1:_ctl3" type="text" /></td>
</tr><tr>
<td><input type="submit" name="MyCompositeControl1:_ctl4" value="Submit" /></td>
</tr>
</table></span>
mapserver 2006-05-11
  • 打赏
  • 举报
回复
RenderContents和Render区别:
Render() 方法基本上控制着 WebControl 的整个输出。默认情况下,Render() 方法实际上会依次调用 RenderBeginTag()、RenderContents() 以及 RenderEndTag()。
RenderContents 方法以呈现开始和结束标记之间的控件内容。

CreateChildControls方法和AddAttributesToRender的区别:
AddAttributesToRender方法:只是添加客户端HTML Tag的属性而已,如颜色、单击事件。
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "alert('Test');");
base.AddAttributesToRender(writer);
CreateChildControls方法:生成子控件,如一个WebControl里有个属性为Collection,那这个属性就可以用子控件。
kittenlpf 2006-05-11
  • 打赏
  • 举报
回复
protected override void Render(HtmlTextWriter output)
{
CreateChildControls();
base.Render(output);
}


protected override void CreateChildControls()
{
Controls.Clear();
ClearChildViewState();
this.BuildControlHierarchy();
}

private void BuildControlHierarchy()
{
Table table = new Table();
table.BorderStyle = BorderStyle.None;
table.Width = Unit.Parse("620px");
table.Height = Unit.Parse("25px");
TableRow row = new TableRow();
table.Rows.Add(row);
TableCell cellBar = new TableCell();
BuildPagerUI(cellBar);
row.Controls.Add(cellBar);
Controls.Add(table);
}

private void BuildPagerUI(TableCell cell)
{
bool isValidPage = (PageIndex >=0 && PageIndex <= PageCount-1);
bool canMoveBack = (PageIndex >0);
bool canMoveForward = (PageIndex < PageCount-1);
//添加首页按钮
LinkButton first = new LinkButton();
first.ID = "first";
first.Click += new EventHandler(first_Click);
first.Text = "首页";
first.Enabled = isValidPage && canMoveBack;
cell.Controls.Add(first);

cell.Controls.Add(new LiteralControl(" "));

//添加上一页按钮
LinkButton prev = new LinkButton();
prev.ID = "Prev";
prev.Click += new EventHandler(prev_Click);
prev.Text = "上一页";
prev.Enabled = isValidPage && canMoveBack;
cell.Controls.Add(prev);

cell.Controls.Add(new LiteralControl(" "));

//添加下一页按钮
LinkButton next = new LinkButton();
next.ID = "Next";
next.Click += new EventHandler(next_Click);
next.Text = "下一页";
next.Enabled = isValidPage && canMoveForward;
cell.Controls.Add(next);

cell.Controls.Add(new LiteralControl(" "));

//添加末页按钮
LinkButton last = new LinkButton();
last.ID = "Last";
last.Click += new EventHandler(last_Click);
last.Text = "末页";
last.Enabled = isValidPage && canMoveForward;
cell.Controls.Add(last);

cell.Controls.Add(new LiteralControl(" "));

//添加当前页和总页码

Label lbl = new Label();
lbl.ID = "label";
lbl.Text = "页次:" + (this.PageIndex + 1).ToString() + "/" + this.PageCount.ToString() + " 页" + " " + this.PageSize.ToString() + "条记录/页 共" + this.TotalCount.ToString() + "条记录 跳转到>>";
cell.Controls.Add(lbl);

cell.Controls.Add(new LiteralControl(" "));

//添加页码
DropDownList pageList = new DropDownList();
pageList.ID = "PageList";
pageList.AutoPostBack = true;
pageList.SelectedIndexChanged += new EventHandler(PageList_Click);

if (PageCount <=0 || PageIndex == -1)
{
pageList.Items.Add("No Pages");
pageList.Enabled = false;
pageList.SelectedIndex = 0;
}
else
{
for(int i=1; i<=PageCount; i++)
{
ListItem item = new ListItem(i.ToString(), (i-1).ToString());
pageList.Items.Add(item);
}
pageList.SelectedIndex = PageIndex;
}
cell.Controls.Add(pageList);
}
lyb_abiandbel 2006-05-11
  • 打赏
  • 举报
回复
我的复合控件中,有两个按钮。我想区分是哪个按钮的Click事件,于是我加入button.CommandName属性,我加入了RenderContents方法,但是在OnBubbleEvent捕获时,根据
CommandEventArgs.CommandName判断,CommandEventArgs.CommandName始终为空。

搞了半天,终于被我发现,OnBubbleEvent方法比RenderContents方法先执行啊,我把button.CommandName=“”放入CreateChildsControl方法,一切ok.CreateChildsControl比OnBubbleEvent先执行。

上面也是的,我把lnameText=“”放入RenderContents方法,一切ok.

看来,如果要写控件,必须把控件生命周期搞清楚,你所重载的方法的执行顺序也要搞清楚。
长江支流 2006-05-10
  • 打赏
  • 举报
回复
我一看就觉得是Web的,原来真是,好久没用了。
记得是直接在方法中写输出的html文本串。
lyb_abiandbel 2006-05-10
  • 打赏
  • 举报
回复
请各位帮帮忙阿!
shalen520 2006-05-10
  • 打赏
  • 举报
回复
1.RenderContents会被Render方法调用
2.当RenderBeginTag被调用时,它会调用AddAttributesToRender来加入类似"width=20 height=20"的代码到html中
3.CreateChildControls在OnPreRender时被调用以创建子控件
lyb_abiandbel 2006-05-10
  • 打赏
  • 举报
回复
如果控件同时实现IPostBackDataHandler,IPostBackEventHandler

应该在LoadPostData方法中用Page.RegisterRequiresPostBack()注册

但是,如果控件只实现IPostBackEventHandler,好像不要注册的吧!
shalen520 2006-05-10
  • 打赏
  • 举报
回复
要回传事件,必须实现IPostBackEventHandler,并调用Page.RegisterRequiresPostBack()方法来注册自己
lyb_abiandbel 2006-05-10
  • 打赏
  • 举报
回复
为什么当我写复合控件的时候,重载了CreateChildreControls方法,没有其他的呈现方法,
但是却不能回传数据和回传事件呢?

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧