<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>控件开发 on 冯威的博客</title><link>https://fwhyy.com/tags/%E6%8E%A7%E4%BB%B6%E5%BC%80%E5%8F%91/</link><description>Recent content in 控件开发 on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 09 Feb 2010 00:00:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/%E6%8E%A7%E4%BB%B6%E5%BC%80%E5%8F%91/atom.xml" rel="self" type="application/rss+xml"/><item><title>Asp.Net控件开发(1)—入门介绍</title><link>https://fwhyy.com/2010/02/aspnet-controls-development-1-the-introduction/</link><pubDate>Tue, 09 Feb 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/02/aspnet-controls-development-1-the-introduction/</guid><description>&lt;p&gt;AspNet为我们提供了很多的控件，尽管如此，很多时候我们还是会感觉这些控件不够用，想根据自己的需求去定制一些控件，比如想在DropDownList控件中实现可以输入，AspNet并没有为我们提供这样的控件，这时就需要我们去编写自定义控件来满足需要。 本系列文章打算对AspNet控件开发做个入门级介绍，如果想了解更详细和深入可以参考&lt;a href="http://www.douban.com/subject/2268475/"&gt;《深入解析ASP.NET 2.0控件开发》&lt;/a&gt;和&lt;a href="http://www.douban.com/subject/3626223/"&gt;《纵向切入ASP.NET 3.5控件和组件开发技术》&lt;/a&gt;这两本书。&lt;/p&gt;
&lt;p&gt;言归正传，通常我们开发自定义控件会创建一个类库项目，编写完代码后编译会生成一个dll文件，这个dll文件就是我们自己开发的控件了。假设现在已经有一个名为HelloWorld.dll的控件，按照下面方法可以将该控件用在我们的项目中。&lt;/p&gt;
&lt;p&gt;1 在工具箱中点击右键-&amp;gt;添加选项卡。选项卡可以任意命名，比如：MyControls&lt;/p&gt;
&lt;p&gt;2 在新添加的选项卡区域中右键-&amp;gt;选择项。选择HelloWorld.dll文件后确定，会看到控件已经添加到工具箱中，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290824855.webp" alt="2010-12-28_235751" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 使用自定义控件和使用普通的AspNet控件一样，直接拖到页面中即可。将该控件拖入到页面中后，源视图中会添加如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;%@ Register Assembly=&amp;#34;ControlsDemo1&amp;#34; Namespace=&amp;#34;ControlsDemo1&amp;#34; TagPrefix=&amp;#34;cc1&amp;#34; %&amp;gt;

 &amp;lt;cc1:HelloWorld ID=&amp;#34;HelloWorld2&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;/cc1:HelloWorld&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面代码的第一行是注册该控件，TagPrefix属性指定控件的前缀，cc1是系统默认的前缀，我们也可以根据自己的喜好来自定义前缀，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;%@ Register Assembly=&amp;#34;ControlsDemo1&amp;#34; Namespace=&amp;#34;ControlsDemo1&amp;#34; TagPrefix=&amp;#34;oec2003&amp;#34; %&amp;gt;
 &amp;lt;oec2003:HelloWorld ID=&amp;#34;HelloWorld1&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;/oec2003:HelloWorld&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;lt;%@ Resgiter /&amp;gt;&lt;/code&gt;指令只是在单个页面中使用，我们还可以通过在web.config中配置来使全局都能够使用。web.config配置如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;system.web&amp;gt;
 &amp;lt;pages&amp;gt;
 &amp;lt;controls&amp;gt;
 &amp;lt;add assembly=&amp;#34;ControlsDemo1&amp;#34; namespace=&amp;#34;ControlsDemo1&amp;#34; tagPrefix=&amp;#34;oec2003&amp;#34;/&amp;gt;
 &amp;lt;/controls&amp;gt;
 &amp;lt;/pages&amp;gt;
&amp;lt;/system.web&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面简单介绍了怎样使用一个已经编写好的自定义控件，并且知道编写一个自定义控件通常是创建一个类库项目。现在就来看看一个自定义控件的具体实现方法。&lt;/p&gt;
&lt;p&gt;实现一个自定义控件，我们需要选择一个基类，这些基类有控件需要的最基本的功能，下面的三个类就是开发控件常用的基类。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;System.Web.UI.Control
System.Web.UI.WebControls.WebControl
System.Web.UI.WebControls.CompositeControl
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Control：控件开发的基类，所有控件都直接或间接继承该类。该类的扩展性和灵活性最强。&lt;/li&gt;
&lt;li&gt;WebControl：该类继承自Control类，除了有Control的所有属性外，还提供布局样式等特性。比较适合对布局和外观样式要求较高的控件。和Control相同的是都适用于开发单个控件。&lt;/li&gt;
&lt;li&gt;CompositeControl：该类为AspNet2.0提供的一个控件基类。如果想把现有控件组合起来创建一个组合控件时，可以继承此类，此类继承了WebControl并实现了INamingContainer接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果我们只是对某一个现有的AspNet控件进行简单的扩充，我们可以用现有的任一控件作为基类。&lt;/p&gt;
&lt;p&gt;Control类最基础灵活性最强，那么就先以Control类为基类实现一个简单的HelloWorld控件。在新建的项目中创建一个类HelloWorld，继承Control，并重写Render方法，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class HelloWorld:Control
{
 protected override void Render(HtmlTextWriter writer)
 {
 writer.WriteLine(&amp;#34;hello world!&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译后按照上面介绍的方法添加到工具箱中，然后拖到页面，运行后会在页面上呈现Hello world文本。现在对上面的代码做点改动让hello world文本的显示区加上边框和背景色，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class HelloWorld:Control
{
 protected override void Render(HtmlTextWriter writer)
 {
 writer.WriteLine(@&amp;#34;&amp;lt;div style=&amp;#34;&amp;#34;width:200px;height:100px;
 border:1px solid #4DA9C2;background-color:#C3D9FF&amp;#34;&amp;#34; &amp;gt;&amp;#34;);
 writer.WriteLine(&amp;#34;hello world!&amp;#34;);
 writer.WriteLine(@&amp;#34;&amp;lt;/div&amp;gt;&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行后的效果：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290825971.webp" alt="2010-12-28_235833" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;效果虽然出来了，但是代码中是使用直接输出html代码和内嵌样式的方式，这样做当然是不好的，不是很好扑捉错误并且生成到客户端的html代码格式也不好。这个问题我们可以通过HtmlTextWriterAttribute、HtmlTextWriterTag、HtmlTextWriterStyle这三个枚举来解决。看下面代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class HelloWorld:Control
{
 protected override void Render(HtmlTextWriter writer)
 {
 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, &amp;#34;1px&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, &amp;#34;solid&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, &amp;#34;#4DA9C2&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, &amp;#34;#C3D9FF&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.Width, &amp;#34;200px&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.Height, &amp;#34;100px&amp;#34;);
 writer.RenderBeginTag(HtmlTextWriterTag.Div);

 writer.WriteLine(&amp;#34;hello world!&amp;#34;);

 writer.RenderEndTag();
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行后效果和上面一样。并且查看页面的源代码可以看出用这种方式生成的html有规范的缩进，并且代码也是符合xhtml规范的，所以建议尽量使用这种方式而不是直接拼写html代码。&lt;/p&gt;</description></item></channel></rss>