.NETカスタムコントロールはどのように実現しますか?

4811 ワード

.NETカスタムコントロールは、実際には試用に慣れていない人が多く、Controlから継承されるのが一般的ですが、仕事で一定量蓄積するとします.NETカスタムコントロールは、今後の作業に役立ちます.
自分でC#と.NETの勉強はそれほど深くないですが、この間はASPを使います.NETがプロジェクトをしに来たのも、外に出て仕方がないので、よく勉強しただけで、勉強が終わった後、感じは確かにとても良くて、Visual Studioの集積開発環境を加えて、この開発は確かに迅速で、しかも上手で、プロジェクトはすぐに完成して、今総括することができなかったものを総括して、深く入ることを決めます.NET.
プロジェクトを開発する時、実は私は全然どうすればいいか分かりません.NETカスタムコントロールは、チェックボックスをカスケードして選択する機能があります.私はThreeViewコントロールを使っています.当時、TreeViewサブノードコントロールの応答イベントをどのように追加するか分かりませんでした.js+domでクライアントにTreeViewを追加してhtml要素を生成するイベントで、面倒で手間がかかり、メンテナンスも不便でした.
だから今回は深く入り込んで、先にNETカスタムコントロールを入手し、いくつかの資料を見て、カスタムコントロールについて.自分で考えれば分かると思う.Netコントロールライブラリのコントロールクラスはどのように書かれているのか、既存のコントロールをよりよく操作したり、カスタムコントロールをよりよく開発したりしません.ネットで探したら、ブログパークでC#反コンパイラReflector(ダウンロードアドレス)を見つけました.http://downloads.red-gate.com/reflector.zip)、使いやすくて、使えます.NETライブラリを逆コンパイルします.
自分のほとんどから、まずコントロール部分を見て、Vsのツールボックスパネルのコントロールの順番に見て、これらのコントロールクラスのソースコード
一つ目はもちろん簡単なLabelクラスです
DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ControlValueProperty("Text"), ControlBuilder(typeof(LabelControlBuilder)), DefaultProperty("Text"), ParseChildren(false), Designer("System.Web.UI.Design.WebControls.LabelDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ToolboxData("<{0}:Label runat=\"server\" Text=\"Label\">"), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]  
public class Label : WebControl, ITextControl  
{  
    // Methods  
    public Label();  
    internal Label(HtmlTextWriterTag tag);  
    protected override void AddAttributesToRender(HtmlTextWriter writer);  
    protected override void AddParsedSubObject(object obj);  
    protected override void LoadViewState(object savedState);  
    protected internal override void RenderContents(HtmlTextWriter writer);  
 
    // Properties  
    [WebCategory("Accessibility"), Themeable(false), IDReferenceProperty, TypeConverter(typeof(AssociatedControlConverter)), DefaultValue(""), WebSysDescription("Label_AssociatedControlID")]  
    public virtual string AssociatedControlID { get; set; }  
    internal bool AssociatedControlInControlTree { get; set; }  
    internal override bool RequiresLegacyRendering { get; }  
    protected override HtmlTextWriterTag TagKey { get; }  
    [PersistenceMode(PersistenceMode.InnerDefaultProperty), WebCategory("Appearance"), Bindable(true), DefaultValue(""), WebSysDescription("Label_Text"), Localizable(true)]  
    public virtual string Text { get; set; }  
} 

Expand Methods
これらはLabelの内蔵メンバーで、カスタムコントロールを書いたことがある友达はすべて知っていて、一般的にControlクラスのRender方法を再ロードします.Netライブラリに含まれるコントロールクラスも例外ではなく、このメソッドを再ロードするLabelの方が簡単です.ページを頼むと、htmlをLabelに生成するのはかなり簡単です.Labelクラスをシミュレートするために、このようなクラスを書くことができます.
 public class MyLabel : Control  
 {  
     public MyLabel()  
     { }  
  
     protected override void Render(HtmlTextWriter writer)   
     {  
  
         writer.RenderBeginTag(HtmlTextWriterTag.Span);  
         writer.Write("Label");  
         writer.RenderEndTag();  
  
     }  
 } 
aspx対応csファイルのloadメソッドに次のコードを書き込む
protected void Page_Load(object sender, EventArgs e)  
{  
    MyLabel ml = new MyLabel();  
    this.form1.Controls.Add(ml);  
} 

結果のhtmlと.NetライブラリのLabel(idが少なくなって、ほほほ)は同じです.もちろん、これは単なる真似です.Labelの他の属性が設定されていると、htmlの内容が変化してドアのLabelのソースコードを見て、LabelのRenderメソッドをリロードするのを見ていませんよね.実は、これはRenderContentsメソッドで親WebControlのRenderメソッドを呼び出し、WebControlではRenderメソッドのリロードを実現しています.
見てごらんRenderContents()
protected internal override void RenderContents(HtmlTextWriter writer)  
{  
    if (base.HasRenderingData())  
    {  
        base.RenderContents(writer);  
    }  
    else  
    {  
        writer.Write(this.Text);  
    }  
} 

私たちがコントロールをカスタマイズするとき、よく直接Controlから継承します.WebControlの性質ですが、WebControlはありますが、多くはControlから継承するのが好きで、なぜか分かりませんが、私はあまり賛成しません.結局、それはソフトウェアの設計から見れば冗長なのではないでしょうか.WebControlは多くの友达の使用に合わないかもしれません.
LabelのAddAttributesToRenderメソッドでは、プロパティの動的追加と表示が実現されます.
私の学习の方法は表面の上でどのように使うことを知ってから、深く入り込んで、その运行のメカニズムを理解して、原理を実现して、そのように简単に全体のフレームワークのシステムの理解を下へ统一することができて、后でものをするのは底のものを気にしないことができて、しかしするのは余裕があります.
ここにHtmlWriterText類があって、ある友達が何をしているのか分からないと思って、私は2つの文章を探して、分からない友達は見ることができますhttp://msdn.microsoft.com/zh-cn/library/system.web.ui.htmltextwriter(VS.80).aspx http://www.cnblogs.com/tonyqus/archive/2005/02/15/104576.html
.NETカスタムコントロールを実装する方法について説明します.