Asp.Netカスタムコントロール開発任我行(4)-View State保存コントロール状態

9713 ワード

  • サマリ


  • 前編では、コントロールのプロパティステータスを保存することを目的としたドロップダウン・ボックスの効果を実現しました.
  • 内容


  • まず1つの例を見てみましょう.バックグラウンドコードは変わりません.UIページのコードだけを変更します.まず、ページに2つのコントロールをドラッグ&ドロップします.1つは私たちが今開発しているこのコントロールで、もう1つはボタンButtonです.
    <body>
    
        <form id="form1" runat="server">
    
        <XYB:TextEdit ID="txt" DropDwonHeight="200" DropdwonWidth="200" runat="server"></XYB:TextEdit>
    
        <asp:Button runat="server" ID="btn" Text="   " OnClick="btn_Click" />
    
        </form>
    
    </body>

    私たちはPageでLoadの中で属性に値を割り当てて、コードは以下の通りです
    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Web;
    
    using System.Web.UI;
    
    using System.Web.UI.WebControls;
    
    
    
    namespace XYB.UI
    
    {
    
        public partial class TextEditUI : System.Web.UI.Page
    
        {
    
            protected void Page_Load(object sender, EventArgs e)
    
            {
    
                if (!IsPostBack)
    
                {
    
                    txt.DropDwonHeight = 100;
    
                    txt.DropdwonWidth = 100;
    
                }
    
               
    
            }
    
    
    
            protected void btn_Click(object sender, EventArgs e)
    
            {
    
    
    
            }       
    
        }
    
    }

    ブラウズを実行してみると、最初の結果は確かに100*100でしたが、ボタンをクリックすると、長さも幅も200に戻りました.つまり、属性値が保存されていません.今はTextEditを修正するだけです.csコードです.View Stateを使用してコントロールのプロパティステータス値を保存します.
    using System;
    
    using System.Text;
    
    using System.Web.UI;
    
    using System.ComponentModel;//            (  )Attribute;
    
    using System.Web.UI.WebControls;
    
    using System.Web.UI.HtmlControls;
    
    using System.Collections.Generic;
    
    
    
    namespace XYB.Controls
    
    {
    
        public class TextEdit:TextBox
    
        {
    
            private int _dropDwonHeight;
    
            private int _dropdwonWidth;
    
    
    
            [Description("      "),//     
    
             Category("   ")//    
    
            ]
    
            public int DropDwonHeight
    
            {
    
                //         DropDwonHeight  ,       50
    
                get { return ViewState["DropDwonHeight"] == null ? 150 : Convert.ToInt32(ViewState["DropDwonHeight"]); }
    
                set { ViewState["DropDwonHeight"] = value; }
    
            }
    
           
    
            [Description("      "),
    
             Category("   ")
    
            ]
    
            public int DropdwonWidth
    
            {
    
                get { return ViewState["DropdwonWidth"] == null ? 150 : Convert.ToInt32(ViewState["DropdwonWidth"]); }
    
                set { ViewState["DropdwonWidth"] = value; }
    
            }
    
    
    
            protected override void Render(HtmlTextWriter writer)
    
            {
    
                base.Render(writer);
    
                Panel pnlDropDown = new Panel();
    
                pnlDropDown.ID = "pnlDropDownID";
    
                pnlDropDown.Height = DropDwonHeight;
    
                pnlDropDown.Width = DropdwonWidth;
    
                pnlDropDown.Style["border"] = "1px solid #ccc";//      
    
                pnlDropDown.RenderControl(writer);//          
    
            }        
    
        }
    
    }

    コントロールを再生成して実行し、ok、ページが返信されたときも属性値は変わりません. 
  • に注意


  • ViewStateはこのページでのみ有効です.たとえば、AページにViewState["A"]がある場合、BページではViewState["A"]がnullになります. 
  • 次回予告


  • カスタムコントロールにリソースを埋め込み、後でどうなるかを予知します.次回の分解を見てください.私に注目してください!!