大家好,
好的,进一步使用自定义控件进行冒险......
总之,这是我已经了解了自定义控件的三个主要“类”。如果有任何错误,请随时纠正我!
好的,所以在玩自定义复合材料时,我发现了以下内容:
所以,我承认,我是新手,所以我可能会偏离上面提到的一些观点......
因为我知道良好的控件开发能够缩短整体开发时间,所以我很想在脑海里真正坚定。
我期待你的回答^ _ ^
答案 0 :(得分:5)
我说继续使用自定义渲染控件。我发现在大多数情况下,复合可以更容易地完成并在UserControl中使用,但除此之外的任何东西都需要有更好的控制程度(双关语),值得你自己的渲染策略。
可能有一些控件非常简单,值得一个复合(例如,一个文本框与基于javascript / dhtml的日期选择器相结合),但除了这个例子之外,它看起来像是自定义渲染控件。< / p>
答案 1 :(得分:3)
这是我用于自定义渲染的另一种扩展方法:
public static void WriteControls
(this HtmlTextWriter o, string format, params object[] args)
{
const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
var controls = new Dictionary<string,Control>();
for(int i =0; i < args.Length; ++i)
{
var c = args[i] as Control;
if (c==null) continue;
var guid = Guid.NewGuid().ToString();
controls[guid] = c;
args[i] = delimiter+guid+delimiter;
}
var _strings = string.Format(format, args)
.Split(new string[]{delimiter},
StringSplitOptions.None);
foreach(var s in _strings)
{
if (controls.ContainsKey(s))
controls[s].RenderControl(o);
else
o.Write(s);
}
}
然后,为了在RenderContents()方法中渲染自定义合成,我写这个:
protected override void RenderContents(HtmlTextWriter o)
{
o.WriteControls
(@"<table>
<tr>
<td>{0}</td>
<td>{1}</td>
</tr>
</table>"
,Text
,control1);
}
答案 2 :(得分:2)
答案 3 :(得分:1)
我经常使用复合控件。而不是重写Render或RenderContents,只需为每个Control分配一个CssClass并使用样式表。对于多个Controls.Add,我使用扩展方法:
//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
{ foreach(Control control in controls) coll.Add(control);
}
对于快速和脏的渲染,我使用这样的东西:
writer.Render(@"<table>
<tr><td>{0}</td></tr>
<tr>
<td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");
为了初始化控件属性,我使用属性初始化器语法:
childControl = new Control { ID="Foo"
, CssClass="class1"
, CausesValidation=true;
};
答案 4 :(得分:1)
使用自定义复合控件时,您需要拥有大型Web应用程序并希望在许多地方重用大块。然后你只会添加你正在开发的子控件,而不是重复自己。 在我最近工作的一个大型项目中,我们所做的是以下内容:
实际上,您需要一个基类来处理使用指定模板初始化容器,并在模板中找不到控件时抛出异常。当然,这在小型应用程序中可能是一种过度杀伤力。如果您没有重用代码和标记,并且只想编写简单的控件,那么最好使用用户控件。
答案 5 :(得分:0)
您可以使用这种技术来简化设计时间:
http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx
基本上,您使用LoadControl方法在运行时创建用户控件的实例,然后将其交给某种状态包,然后将其附加到控制树。所以你的复合控件实际上会像一个控制器一样运行,而.ascx文件就像一个视图。
这样可以省去必须实例化整个控制树并在C#中设置控件样式的麻烦!