自定义控件后台添加问题

aiaaaa 2006-08-07 10:35:32
在程序后台代码中
写Response.Write("<input type='submit' name='button1' value='确定' id='button1' style='width:64px;Z-INDEX: 101; LEFT: 20px; POSITION: absolute; TOP: 100px' />");
这样的可以显示出控件
但是自定义控件
Response.Write("<uc1:UseControl id='UseControl1' runat='server'></uc1:UseControl>");
却不显示!
该怎么样写才能正常显示出来??? 原因何在?
高手指教
...全文
539 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiaaaa 2006-08-07
  • 打赏
  • 举报
回复
this.Panel1.Controls.Add(控件);
也不可以啊
sunjay117 2006-08-07
  • 打赏
  • 举报
回复
那样当然不行了,
添加一个panel
this.Panel1.Controls.Add(控件);
aiaaaa 2006-08-07
  • 打赏
  • 举报
回复
没人回答?
aiaaaa 2006-08-07
  • 打赏
  • 举报
回复
问题基本解决拉
谢谢大家
最后那位仁兄写的那么多
就是没看明白 呵呵 非常感谢
blackant2 2006-08-07
  • 打赏
  • 举报
回复
5实现basepage,可以从RaiseCallbackEvent得到客户端的请求,传回_Result用于展现ascx;

public class AppSettings:BasePage
{
public override void RaiseCallbackEvent(string argu)
{
try
{
String[] args = argu.Split(new char[] { '|' }, 2);
if (args.Length == 2)
{
string command = args[0];
string arg = args[1];
switch (command)
{//如果传回的是LoadAscxFile|ascxfilename格式的参数.
//其它的参数格式与本例无关省略之.如果command过多,可以考虑反射
case "LoadAscxFile":
_Result = LoadAscxFile(arg);
break;
default:
_Result = StaticMethod.GetMessage("BadCommand");
break;
}
}
else
{
_Result = StaticMethod.GetMessage("BadCommand");
}
}
catch (Exception excep) { _Result = excep.ToString(); }
}

public override string GetCallbackResult()
{
return _Result;
}

private string LoadAscxFile(string ascxFileName) {
try {
//这是一个权限验证,可省略
if (!StaticMethod.ValidateUserRight(ascxFileName)) {
return StaticMethod.GetMessage("InvalidateOperation");
}
else
{
//由ascxfilename反射得到类实例,比如刚才第2,3步实现的CacheStrategys
//的表现层和逻辑层(ascx/cs)
Type t = Type.GetType("Hubei.Blackant.Controls." + ascxFileName);
BaseUserControl buc = (BaseUserControl)Activator.CreateInstance(t);
//将usercontrol写入到StringWriter,回传
//在此感谢CSDN社区reaperwu(RQ)的帮助
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
buc.RenderControl(htw);
return sw.ToString();
}
}
catch (Exception excep){
return excep.ToString();
}
}
6好了,做了一大堆事,事实上我们什么也没有得到,还没有页面来实现它呢,55555,多简单的事让我们弄复杂了
<!--这儿的Inherits由第5步实现,55555,上面没有定义namespace-->
<%@ Page Language="C#" Inherits="Hubei.Blackant.AppSettings" ClassName="AppSettings"%>
<%@ Register TagPrefix="bawc" Namespace="Hubei.Blackant.Controls" Assembly="Hubei.Blackant"%>
<asp:Content ContentPlaceHolderID="HeadTag" runat="server" ID="HeadContext">
<script type="text/javascript">
<!--
function loadAscxFile(ascxfile){
var command="LoadAscxFile|"+ascxfile;
var content=true;//这个content实在不知道有什么用,在ClientScriptManager中要实现
//但是在服务端并不会被接收,而是直接回传给客户端回叫函数
<%=ClientScript.GetCallbackEventReference(this,"command","ShowClientContext","content")%>
}
function ShowClientContext(result,context){
//也许传回context的本意是想让result和context关联,但是总觉得多余
//很多示例在这儿是用result来改变context的属性
var ClientContext=document.getElementById("ClientContext");
ClientContext.innerHTML=result;
}
//-->
</script>
<a href="javascript:LoadAscxFile('CacheStrategys');">Test</a>
<div id="ClientContext">
</div>
7好了,基本上能用了,我们再来回顾一下整个事件过程,这次倒着来,不是由实现的倒序,而是由事件的激发过程用实先click第6步中的anchor会激发javascript定义的LoadAscxFile,在LoadAscxFile中由ClientScriptManager.GetCallbackEventReference激发服务端事件,也就是第五步中的RaiseCallbackEvent,事件接收了LoadAscxFile|CacheStrategys参数,分解后会调用LoadAscxFile方法,LoadAscxFile由反射得到第3步中定义的CacheStrategys实例,CacheStrategys会调用第2步中的ascx文件做为样式,好了,有了这样的用usercontrol来做表现层之后(个人认为这是个比较合理的选择,其实也可以试着由TempableControl来实现,不知道为什么一开始就想到了UserControl),再回到第LoadAscxFile,它会返回CacheStrategys实例的html格式表现方式,并由RaiseCallbackEvent赋值给_Result,然后由GetCallbackResult返回给客户端,客户端再由ClientScriptManager.GetCallbackEventReference定义的回叫方法,此处是ShowClientContext来实现这个html的展现
ps:祝大家开开心心每一天,重要的是写的不好不要骂我,如有错误请写信给我指正blackant@tt88.cn,另有一个问题想请达人指点,如果usercontrol中定义了javascript,返回是客户端能接收到,但其中的定义无效,可能需要document.write(scriptdefine),但是毕竟这样不合理,有好办法解决的也请一并mail2me

blackant2 2006-08-07
  • 打赏
  • 举报
回复
原文出处:http://blog.csdn.net/blackant2/archive/2006/07/23/963941.aspx
1.继承TemplateControl/usercontrol/page中的一个,因为是要回传的视图状态,所以选择了usercontrol,比较适合定义视图状态

public class BaseUserControl:UserControl
{
private Control skin;
public Control Skin { get { return skin; } }
public BaseUserControl()
{

///此处定义了要调用的ascx文件的路径,其中的一切变量希望大家忽略,实在与本例无关
string path = "{0}MasterPages/{1}/UserControls/{2}.ascx";
string ascxFileName = this.GetType().Name;
string virpath = String.Format(path, HttpRuntime.AppDomainAppVirtualPath, StaticMethod.CurrentUser.MasterPage, ascxFileName);
if (!File.Exists(HttpContext.Current.Server.MapPath(virpath)))
{///指定的文件如果存在,从此处载入ascx文件
virpath = String.Format(path, HttpRuntime.AppDomainAppVirtualPath, Gloable.MasterPage, ascxFileName);
if (!File.Exists(HttpContext.Current.Server.MapPath(virpath)))
{//如果默认的ascx文件也不存在,则返回一个新的Literalcontrol或抛出异常
//throw (new Exception(String.Format(StaticMethod.GetMessage("FileNotFind"), virpath)));
Literal lit=new Literal();
lit.Text = String.Format("{0} Not Found", virpath);
skin = lit;
}
else {
skin = LoadControl(virpath);
}
}
Controls.Add(skin);
}
}

2:ascx文件

<asp:Repeater runat="server" ID="Rep_CacheStrategys">
<HeaderTemplate>
<table id="TabCacheStrategys">
<tr>
<td>关键字</td>
<td>说明</td>
<td>缓存策略</td>
<td>缓存时间(毫秒)</td>
<td>缓存代价</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><asp:Label runat="server" id="Lab_Key" ></asp:Label></td>
<td><asp:Label runat="server" ID="Lab_Description"></asp:Label></td>
<td><asp:DropDownList runat="server" ID="DDL_Strategy">
<asp:ListItem Value="Dependency">依赖缓存</asp:ListItem>
<asp:ListItem Value="Absolute">绝对缓存</asp:ListItem>
<asp:ListItem Value="Relative">相对缓存</asp:ListItem>
<asp:ListItem Value="None">不缓存</asp:ListItem>
</asp:DropDownList></td>
<td><asp:TextBox runat="server" ID="TB_Expiration"></asp:TextBox></td>
<td><asp:DropDownList runat="server" id="DDL_Priority">
<asp:ListItem Value="NotRemovable">不可移除</asp:ListItem>
<asp:ListItem Value="AboveNormal">最高优先级</asp:ListItem>
<asp:ListItem Value="High">略高</asp:ListItem>
<asp:ListItem Value="Normal">正常</asp:ListItem>
<asp:ListItem Value="Low">略低</asp:ListItem>
<asp:ListItem Value="BelowNormal">最低优先级</asp:ListItem>
</asp:DropDownList></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</Table>
</FooterTemplate>
</asp:Repeater>

3.继续baseusercontrol实现usercontrol的展示

public class CacheStrategys:BaseUserControl
{
public CacheStrategys() : base() {

//实现数据绑定Cacheddatas.CachedData.CacheStragegyCollection是一个CacheStragegyItem数组
//同样与本例无关,请忽略之
Repeater Rep_CacheStrategys = (Repeater)Skin.FindControl("Rep_CacheStrategys");
if (Rep_CacheStrategys != null) {
Rep_CacheStrategys.ItemDataBound += new RepeaterItemEventHandler(Rep_CacheStrategys_ItemDataBound);
Rep_CacheStrategys.DataSource = Cacheddatas.CachedData.CacheStragegyCollection;
Rep_CacheStrategys.DataBind();
}
}

void Rep_CacheStrategys_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//throw new Exception("The method or operation is not implemented.");
//实现数据绑定的过程省略

}
}

4.好了,我们现在有一个usercontrol了,下一步的目标是从实现了icallbackeventhandler接口的page将它回传给客户端.因为我比较容易忘事,所以一样先做了一个basepage的抽象基类,这一步是可以省略的, 可以直接由page来实现它

public abstract class BasePage:Page,ICallbackEventHandler
{
public string _Result;
public abstract void RaiseCallbackEvent(string arg);
public abstract string GetCallbackResult();
}

rhathymia 2006-08-07
  • 打赏
  • 举报
回复
重写一下LOAD 事件
rhathymia 2006-08-07
  • 打赏
  • 举报
回复
就像可以通过编程方式在 Web 窗体页上创建任意 ASP.NET 服务器控件的实例,也可以通过使用包含页的 LoadControl 方法来做到这一点。
但首先必须使用 @ Control 指令的 className 属性将强类型与用户控件相关联。之所以需要这样是因为 LoadControl 方法返回 Control 类的类型,并且需要将该用户控件转换为合适的强类型,以便设置该控件的各个属性。
以下代码使用 className 属性将 MyUserControl.ascx 文件中保存的用户控件转换为强类型。
<%@ Control className="MyUserControl" %>
步骤
使用@ Reference 指令在要包含用户控件的 Web 窗体页的顶部注册该用户控件。当以编程方式创建用户控件时,只有您创建了对该控件的引用后,才可对 Web 窗体页使用该用户控件的强类型
例如,以下代码创建对 MyUserControl.ascx 文件中所创建用户控件的引用。
<%@ Reference Control="MyUserControl.ascx" %>
在代码隐藏类文件中,或是在包含 .aspx 文件的代码声明块中,创建用户控件的实例
根据需要分配属性值,并使用 Add 方法将该控件添加到包含页的 ControlCollection 对象上
这使该控件可用于该页的继承的 Control.Controls 属性
在以下示例中,创建 MyUserControl.ascx 的实例并将其 BackColor 属性设置为 blue。
Control c1 = LoadControl("MyUserControl.ascx");
((MyUserControl)c1).BackColor = "blue";
Page.Controls.Add(c1);
aiaaaa 2006-08-07
  • 打赏
  • 举报
回复
但是我用 楼上的
不执行 load 事件
加载上拉没对我的数据进行绑定
zhangxiaopin 2006-08-07
  • 打赏
  • 举报
回复
public void LoadUserControl(Panel mpanel, string strUserControlURL)
{
if (strUserControlURL != "")
{
Control ctrl = LoadControl(strUserControlURL);
mpanel.Controls.Add(ctrl);
}
}
learn_cn 2006-08-07
  • 打赏
  • 举报
回复
你的页面中有Panel1这个容器么??
没有的话,你怎么动态添加控件呢.

先创建一个新的控件实例,然后用容器的Controls.Add来添加它
aiaaaa 2006-08-07
  • 打赏
  • 举报
回复
人呢?

62,046

社区成员

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

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

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

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