<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      【Talk is cheap. Show me the code.】 公眾號如有回復(fù)不及時的,麻煩點擊聯(lián)系關(guān)于我-聯(lián)系博主,微信我。謝謝!
      老帥哥

      Stephen-kzx的博客

      【Talk is cheap. Show me the code.】【公眾號如有回復(fù)不及時的,麻煩點擊聯(lián)系關(guān)于我-聯(lián)系博主,微信我。謝謝!】

      玩轉(zhuǎn)控件:封裝Dev的LabelControl和TextEdit

        俗話說的好:"工欲善其事必先利其器",作為軟件攻城獅也是同樣道理,攻城獅開發(fā)的軟件目的是簡化客戶的操作,讓客戶動動手指就可以完成很多事情,減少人力成本。這也是系統(tǒng)/軟件存在的目的。那對于攻城獅來說怎么簡化自己的操作?讓自己也動動手指就可以減少很多重復(fù)的工作呢?如果你對此也有同樣的疑問或興趣,那就跟作者一起看下去吧!

        說到利器,自然而然的會想到宇宙第一IDE——Visual Studio 隨著版本的迭代,大大的加快了攻城獅的編碼效率。那對于我們自己開發(fā)的軟件,如何減少重復(fù)操作,加快軟件進度呢?這就是作者今日的主題——封裝控件。

              作者幾年前有幸作為公司代表,到金蝶總部參觀,并學(xué)習當年金蝶最新科技——K3 Cloud,說實話,作者當年年輕氣盛,和普遍技術(shù)開發(fā)一樣,心高氣傲,對除自己研發(fā)以外的軟件不屑一顧,覺得自己才是最流P的!現(xiàn)在好了,善惡終有報,輪到自己爬著學(xué)習K3 Cloud的控件封裝來造輪子了...

         想當年,金戈鐵馬,氣吞萬里如虎!....現(xiàn)如今,想起來都是淚...

              扯遠了,還是回到本篇的主題造輪子...哦,不!玩轉(zhuǎn)控件!封裝自己的插件吧!

              今天作者主要介紹的是,封裝Dev的LabelControl和TextEdit。原因很簡單,說的好聽就是簡化自己重復(fù)操作,封裝前,拖控件大法,先拖一個LabelControl ,完善它的屬性。在拖一個TextEdit,完善它的屬性,必要時還要完善它的控件。你以為現(xiàn)在就完了嗎?不對,還要拖動一下,看看上下左右的對齊效果....emmmmm~

         Talk is Cheap,Show me the Code!

         首先我們先新建一個用戶控件,繼承UserControl,為了減少冗余代碼,作者把命名為BaseControl,后續(xù)所有用戶控件全部繼承此類。

      public partial class KzxBaseControl : System.Windows.Forms.UserControl,IControl

         其中IControl接口主要用來聲明,控件的一些屬性和事件,部分代碼如下(代碼篇幅較長,有需要公眾號call我,源碼免費贈送):

       /// <summary>
          /// 控件事件委托
          /// </summary>
          /// <param name="sender">事件發(fā)起者</param>
          /// <param name="e">事件參數(shù)</param>
          public delegate void KzxControlOperateEventHandler(object sender, ControlEventArgs e);
      
          /// <summary>
          /// 獲取多語言文本事件委托
          /// </summary>
          /// <param name="sender">事件發(fā)起者</param>
          /// <param name="messageCode">語言標識</param>
          /// <param name="text">多語言的文本</param>
          public delegate void KzxGetLanguageEventHandler(object sender, string messageCode, ref string text);
          public interface IControl
          {
              /// <summary>
              /// 有Load方法
              /// </summary>
              bool HasLoad { get; }
      
              /// <summary>
              /// 被引用后允許修改
              /// true允許,false不允許
              /// </summary>
              bool AllowEdit { get; set; }
      
              /// <summary>
              /// 多語言環(huán)境下顯示文本的對應(yīng)標識
              /// </summary>
              string MessageCode { get; set; }
      
              /// <summary>
              /// 設(shè)計時的顯示,方便設(shè)計員工識別
              /// </summary>
              string DesigeCaption { get; set; }
      
              /// <summary>
              /// 控件的唯一標識
              /// </summary>
              string Key { get; set; }
      
              /// <summary>
              /// True控件可用,False控件不可用
              /// </summary>
              Boolean Enabled { get; set; }
      
              /// <summary>
              /// True控件可見,False控件不可見
              /// </summary>
              Boolean Visible { get; set; }
      
              /// <summary>
              /// Tag標志,用于存儲任何數(shù)據(jù)
              /// </summary>
              object Tag { get; set; }
      
              /// <summary>
              /// 設(shè)計時的可用性
              /// </summary>
              Boolean DesigeEnabled { get; set; }
              ...
              ...

         用戶控件父類,主要集中所有用戶控件的通用屬性、方法和事件,部分代碼如下:

      private bool _AllowEdit = true;
        /// <summary>
        /// 被引用后允許修改
        /// true允許,false不允許
        /// </summary>
        [Category("驗證"), Description("AllowEdit,被引用后允許修改,true允許,false不允許"), Browsable(true)]
        [McDisplayName("AllowEdit")]
        public virtual bool AllowEdit
        {
            get
            {
                return this._AllowEdit;
            }
            set
            {
                this._AllowEdit = value;
            }
        }
        
        private string _MessageCode = "0";
        /// <summary>
        /// 多語言環(huán)境下顯示文本的對應(yīng)標識
        /// </summary>
        [Category("多語言"), Description("MessageCode,多語言環(huán)境下顯示文本的對應(yīng)標識"), Browsable(true)]
        [McDisplayName("MessageCode")]
        public virtual string MessageCode
        {
            get
            {
                return this._MessageCode;
            }
            set
            {
                this._MessageCode = value;
            }
        }
        
        private string _DesigeCaption = "顯示標題";
        /// <summary>
        /// 沒有多語言的情況下的默認顯示標題
        /// </summary>
        [Category("多語言"), Description("DesigeCaption,沒有多語言的情況下的默認顯示標題"), Browsable(true)]
        [McDisplayName("DesigeCaption")]
        public virtual string DesigeCaption
        {
            get
            {
                return this._DesigeCaption;
            }
            set
            {
                this._DesigeCaption = value;
            }
        }
        
        private string _Key = string.Empty;
        /// <summary>
        /// 控件的唯一標識
        /// </summary>
        [Category("數(shù)據(jù)"), Description("Key,控件的唯一標識"), Browsable(true)]
        [McDisplayName("Key")]
        public virtual string Key
        {
            get
            {
                if (string.IsNullOrWhiteSpace(this._Key) == true)
                {
                    if (string.IsNullOrWhiteSpace(this.Table) == false && string.IsNullOrWhiteSpace(this.Field) == false)
                    {
                        this._Key = this.Table + "." + this.Field;
                    }
                    else if (string.IsNullOrWhiteSpace(this.Table) == false)
                    {
                        this._Key = this.Table;
                    }
                } 
                if (string.IsNullOrEmpty(this._Key)) return this.Name; 
        
                return this._Key;
            }
            set
            {
                this._Key = value;
            }
        }
        
        private bool _DesigeEnabled = true;
        /// <summary>
        /// 設(shè)計時的可用性
        /// </summary>
        [Category("特性"), Description("DesigeEnabled,設(shè)計時的可用性"), Browsable(true)]
        [McDisplayName("DesigeEnabled")]
        public virtual bool DesigeEnabled
        {
            get
            {
                return this._DesigeEnabled;
            }
            set
            {
                this._DesigeEnabled = value;
                //this.Enabled = value;
            }
        }
        
        private bool _DesigeVisible = true;
        /// <summary>
        /// 設(shè)計時可見性
        /// </summary>
        [Category("特性"), Description("DesigeVisible,設(shè)計時可見性"), Browsable(true)]
        [McDisplayName("DesigeVisible")]
        public virtual bool DesigeVisible
        {
            get
            {
                return this._DesigeVisible;
            }
            set
            {
                this._DesigeVisible = value;
                //this.Visible = value;
                if (this.DesignMode == true)
                {
                    if (value == false)
                    {
                        this.BorderStyle = BorderStyle.Fixed3D;
                    }
                    else
                    {
                        this.BorderStyle = BorderStyle.None;
                    }
                }
                else
                {
                    //this.Visible = value;
                }
            }
        }
       /// <summary>
      /// 觸發(fā)控件事件
      /// </summary>
      /// <param name="sender">事件發(fā)起者</param>
      /// <param name="eventName">事件名稱</param>
      /// <param name="e">事件參數(shù)</param>
      protected virtual void RaiseEvent(object sender, string eventName, object e)
      {
          ControlEventArgs args = new ControlEventArgs();
          args.CurrentControl = sender;
          args.EventId = eventName;
          args.SystemEventArgs = e;
          args.FieldName = this.Field;
          args.TableName = this.Table;
          args.Key = this.Key;
          if (this.KzxControlOperate != null)
          {
              this.KzxControlOperate(this, args);
              e = args.SystemEventArgs;
          }
      }
      
      
      private static MethodInfo _methodInfo = null;
      
      /// <summary>
      /// 獲取多語言文本
      /// </summary>
      /// <param name="messageCode">語言文本標識</param>
      /// <param name="defaultMessage">默認的文本</param>
      /// <returns>取到的文本</returns>
      protected virtual string GetLanguage(string messageCode, string defaultMessage)
      {
          string text = string.Empty;
      
          try
          {
              text = defaultMessage;
              string filepath = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "KzxCommon.dll");
              Assembly assembly = null;
              object obj = null;
      
              Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
              for (int i = 0; i < assemblies.Length; i++)
              {
                  if (assemblies[i].GetName().Name.Equals("KzxCommon", StringComparison.OrdinalIgnoreCase) == true)
                  {
                      assembly = assemblies[i];
                      break;
                  }
              }
              if (assembly == null)
              {
                  assembly = Assembly.LoadFrom(filepath);
              }
              obj = assembly.CreateInstance("KzxCommon.sysClass");
              text = defaultMessage;
              if (_methodInfo == null)
              {
                  if (obj != null)
                  {
                      _methodInfo = obj.GetType().GetMethod("ssLoadMsg", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
                      if (_methodInfo != null)
                      {
                          text = _methodInfo.Invoke(obj, new object[] { messageCode }).ToString();
                      }
                  }
              }
              else
              {
                  text = _methodInfo.Invoke(obj, new object[] { messageCode }).ToString();
              }
          }
          catch (Exception ex)
          {
      
          }
          return string.IsNullOrWhiteSpace(text) == true ? defaultMessage : text;
      }
      
      protected virtual void OnKzxBaseControlLoad()
      {
          object obj = null;
          PropertyInfo pi = null;
          for (int i = 0; i < this.Controls.Count; i++)
          {
              if (this.Controls[i].Name.Equals("ValueControl", StringComparison.OrdinalIgnoreCase) == true)
              {
                  pi = this.Controls[i].GetType().GetProperty("ErrorIconAlignment");
                  if (pi != null)
                  {
                      pi.SetValue(this.Controls[i], ErrorIconAlignment.TopRight, null);
                  }
              }
          }
      }
      
      protected override void OnControlAdded(System.Windows.Forms.ControlEventArgs e)
      {
          base.OnControlAdded(e);
          OnKzxBaseControlLoad();
          SetAppearance();
      }

        介紹完基類,我們新建在新建要給用戶控件來繼承它,并實現(xiàn)業(yè)務(wù)需求:

          /// <summary>
          /// 文本框驗證
          /// </summary>
          [ToolboxBitmapAttribute(typeof(Bitmap), "文本框")]
          public partial class KzxTextBox : KzxBaseControl

         布局方面,應(yīng)自己要求,氣運丹田,使出拖控件大法!

         此處無需做任何屬性、事件設(shè)置。只需把我們?nèi)粘3S玫降膶傩浴⑹录锰匦詷擞浧饋砑纯伞2糠执a如下:

       private DevExpress.XtraEditors.Controls.BorderStyles _BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Default;
      /// <summary>
      /// 邊框顯示格式
      /// </summary>
      [Category("數(shù)據(jù)格式"), Description("KzxBorderStyle,邊框顯示格式"), Browsable(true)]
      [McDisplayName("KzxBorderStyle")]
      public override DevExpress.XtraEditors.Controls.BorderStyles KzxBorderStyle
      {
          get
          {
              return this.ValueControl.Properties.BorderStyle;
          }
          set
          {
              this._BorderStyle = value;
              this.ValueControl.Properties.BorderStyle = value;
          }
      }
      
      /// <summary>
      /// 沒有多語言的情況下的默認顯示標題
      /// </summary>
      [Category("多語言"), Description("DesigeCaption,沒有多語言的情況下的默認顯示標題"), Browsable(true)]
      [McDisplayName("DesigeCaption")]
      public override string DesigeCaption
      {
          get
          {
              return this.CaptionControl.Text.Trim();
          }
          set
          {
              this.CaptionControl.Text = value;
          }
      }
      
      private bool _IsNull = true;
      /// <summary>
      /// 可空性
      /// </summary>
      [Category("驗證"), Description("IsNull,可空性"), Browsable(true)]
      [McDisplayName("IsNull")]
      public override bool IsNull
      {
          get
          {
              SetBackColor();
              return this._IsNull;
          }
          set
          {
              this._IsNull = value;
              SetBackColor();
          }
      }
      
      /// <summary>
      /// 只讀性
      /// </summary>
      [Category("驗證"), Description("ReadOnly,只讀性"), Browsable(true)]
      [McDisplayName("ReadOnly")]
      public override bool ReadOnly
      {
          get
          {
              SetBackColor();
              return this.ValueControl.Properties.ReadOnly;
          }
          set
          {
              this.ValueControl.Properties.ReadOnly = value;
              SetBackColor();
               if (value == false)
              {
                  this.ValueControl.BackColor = Color.White;
              }
          }
      }
      
      private int maxLength = 0;
      /// <summary>
      /// 可錄入的最大長度
      /// </summary>
      [Category("驗證"), Description("MaxLength,可錄入的最大長度"), Browsable(true)]
      [McDisplayName("MaxLength")]
      public override int MaxLength
      {
          get
          {
              return maxLength;
          }
          set
          {
              maxLength = value;
          }
      }
      
      private Int32 _CaptionLabelWidth = 75;
      /// <summary>
      /// 顯示標題寬度
      /// </summary>
      [Category("外觀"), Description("CaptionLabelWidth,顯示標題寬度"), Browsable(true)]
      [McDisplayName("CaptionLabelWidth")]
      public Int32 CaptionLabelWidth
      {
          get
          {
              return this.CaptionControl.Width;
          }
          set
          {
              this._CaptionLabelWidth = value;
              this.CaptionControl.Width = value;
          }
      }
      
      private string toolTipMaxLengthText = string.Empty;
      /// <summary>
      /// 數(shù)據(jù)長度不能超過數(shù)據(jù)庫長度提示文本  
      /// </summary>
      public override string ToolTipMaxLengthText
      {
          get { return toolTipMaxLengthText; }
          set { toolTipMaxLengthText = value; }
      }
      
      /// <summary>
      /// 提示信息
      /// </summary>
      [Category("汽泡提示"), Description("ToolTipText,提示信息"), Browsable(true)]
      [McDisplayName("ToolTipText")]
      public override string ToolTipText
      {
          get
          {
              return (ValueControl == null) == true ? string.Empty : ValueControl.ToolTip;
          }
          set
          {
              if (ValueControl != null)
              {
                  ValueControl.ToolTip = value;
              }
              if (CaptionControl != null)
              {
                  CaptionControl.ToolTip = value;
              }
          }
      }
      
      
      
      private string _ToolTipMessageCode = string.Empty;
      /// <summary>
      /// 提示多語言標識
      /// </summary>
      [Category("汽泡提示"), Description("ToolTipMessageCode,提示信息多語言標識"), Browsable(true)]
      [McDisplayName("ToolTipMessageCode")]
      public override string ToolTipMessageCode
      {
          get
          {
              return this._ToolTipMessageCode;
          }
          set
          {
              this._ToolTipMessageCode = value;
          }
      }

          一起看看用戶控件效果以及封裝的屬性事件:

          F5看看運行效果:

          Done! 一個控件,減少一半操作量! 在此,本控件當作作者拋磚引玉,看官們可以根據(jù)自己實際情況進行數(shù)據(jù)封裝。有效的封裝,避免畫蛇添足哦~

              最后,由于后續(xù)所有重寫/重繪控件都在同一個項目使用,而且Dev系統(tǒng)引用文件較多,壓縮后源碼文件仍然很大,如果有需要源碼的朋友,可以微信公眾號聯(lián)系博主,源碼可以免費贈予~!有疑問的也可以CALL我一起探討,最最后,如果覺得本篇博文對您或者身邊朋友有幫助的,麻煩點個關(guān)注!贈人玫瑰,手留余香,您的支持就是我寫作最大的動力,感謝您的關(guān)注,期待和您一起探討!再會!

      posted @ 2020-03-25 17:58  何以解憂唯有*碼  閱讀(1422)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区在线有码| 综合偷自拍亚洲乱中文字幕 | 国产精品亚洲一区二区z| 日韩成人精品一区二区三区| 日本道不卡一二三区视频| 国产在线拍揄自揄视频网试看| 中文字幕在线精品人妻| 亚洲熟妇无码八av在线播放| 国产精品白浆在线观看免费| 亚洲熟女乱色一区二区三区| 国产360激情盗摄全集| 亚洲精品综合网在线8050影院| 中文字幕亚洲资源网久久| 色护士极品影院| 天天摸天天做天天添欧美| 东京热人妻无码一区二区AV| 国产精品毛片av999999| 国产成人午夜精品永久免费| 国产高清在线a视频大全| 久久96热在精品国产高清| 久久精品亚洲精品国产色婷| 亚洲av午夜福利精品一区二区| 精品国产乱来一区二区三区| 欧美猛少妇色xxxxx猛叫 | 自拍偷区亚洲综合第二区| 黑人大群体交免费视频| 日韩卡一卡2卡3卡4卡| 双腿张开被5个男人调教电影| 97精品人妻系列无码人妻| 亚洲日本欧美日韩中文字幕| 精品无码成人片一区二区| 下面一进一出好爽视频| 国产91丝袜在线播放动漫| 欧美奶涨边摸边做爰视频 | 国产精品美女黑丝流水| 日99久9在线 | 免费| 色综合久久天天综线观看| 国产精品久久人妻无码网站一区| 一本久久a久久精品亚洲| 美女黄网站人色视频免费国产| 亚洲国产成人综合精品|