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

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

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WinForm控件開發總結(八)-----為屬性提供彈出式編輯對話框

            前幾篇文章我們一直在討論如何更方便的編輯復雜類型的屬性,在這個過程中我介紹了類型轉換器以及如何制作自己的類型轉換器來實現屬性值的串行化和實現子屬性的編輯。對于Scope這種級別的復雜屬性,一個類型轉換器就已經足夠了,但是對于更為復雜的屬性,單單使用類型轉換器已經不足以應付了,比如我們常用的Font屬性。
             在這種情況下,我們就需要提供更為復雜的編輯方式,比如屬性編輯對話框,你還記得Font對話框嗎?現在我們就來看看如何實現更復雜的屬性編輯。復雜的屬性編輯器分為兩種類型,一種是彈出式模態對話框屬性編輯器,一種式下拉式屬性編輯器。如果你還沒有感性的認識的話,可以觀察一下TextBox控件的屬性,Font屬性的編輯器是模態對話框屬性編輯器,Dock屬性的編輯器是下拉式屬性編輯器。
             接下來我們來制作一個模態對話框編輯器,雖然Scope屬性并不復雜,但是為了演示的方便,我們還是用它來做例子。
             首先我們要做一個用來編輯屬性的對話框,在對話框的構造函數里傳入要編輯的屬性的值。在對話框類里,聲明一個Scope類型的私有變量_scope用以保存傳入和編輯后的值。還要增加一個Scope屬性,以便外部環境能夠獲取編輯后的結果。對話框的外觀如下: 
            
             在這個對話框里,我們要把OK按鈕的DialogResult屬性設為OK(當點擊OK按鈕時,模態對話框關閉,并返回DialogResult.OK),將Cancel按鈕的DialogResult屬性設為Cancel(當點擊OK按鈕時,模態對話框關閉,并返回DialogResult.OK)。另外我們要對用戶輸入的值做驗證,以保證Scopeminmax值都是Int32類型。下邊是對話框的代碼:
            

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Text;
      using System.Windows.Forms;

      namespace CustomControlSample
      {
          
      public partial class ScopeEditorDialog : Form
          
      {
              
      private Scope _scope = null;

              
      public ScopeEditorDialog(Scope scope)  
              
      {
                  InitializeComponent();
                  _scope 
      = scope;

                  textBox1.Text 
      = _scope.Min.ToString();
                  textBox2.Text 
      = _scope.Max.ToString();
              }


              
      private void button1_Click(object sender, EventArgs e)
              
      {
                  _scope.Min 
      = Convert.ToInt32(textBox1.Text);
                  _scope.Max 
      = Convert.ToInt32(textBox2.Text);
              }


              
      private void textBox1_Validating(object sender, CancelEventArgs e)
              
      {
                  
      try
                  
      {
                      Int32.Parse(textBox1.Text);
                      
                  }

                  
      catch (FormatException)
                  
      {
                      e.Cancel 
      = true;
                      MessageBox.Show(
      "無效的值""驗證錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                  }

              }


              
      private void textBox2_Validating(object sender, CancelEventArgs e)
              
      {
                  
      try
                  
      {
                      Int32.Parse(textBox2.Text);
                  }

                  
      catch (FormatException)
                  
      {
                      e.Cancel 
      = true;
                      MessageBox.Show(
      "無效的值""驗證錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                  }

              }


              
      public Scope Scope
              
      {
                  
      get
                  
      {
                      
      return _scope;
                  }

                  
      set
                  
      {
                      _scope 
      = value;
                  }

              }

          }

      }

               每一個屬性的編輯器都是直接或者間接的派生于UITypeEditor。開發環境從來也不會直接調用我們編寫的模態對話框來編輯屬性,而是調用UITypeEditor的某些虛方法,所以我們還必須提供一個派生于UITypeEditor的類來與開發環境通信。下邊的代碼實現了Scope的編輯器:
            

      using System;
      using System.ComponentModel;
      using System.Drawing.Design;
      using System.Windows.Forms.Design;
      using System.Windows.Forms;

      namespace CustomControlSample
      {
          
      public class ScopeEditor:UITypeEditor
          
      {
              
      public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
              
      {
                  
      if (context != null && context.Instance != null)
                  
      {
                      
      return UITypeEditorEditStyle.Modal;
                  }


                  
      return base.GetEditStyle(context);
              }


              
      public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
              
      {
                  IWindowsFormsEditorService editorService 
      = null;

                  
      if (context != null && context.Instance != null && provider != null)
                  
      {
                      editorService 
      = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
                      
      if (editorService != null)
                      
      {
                          MyListControl control 
      = (MyListControl)context.Instance;
                          ScopeEditorDialog dlg 
      = new ScopeEditorDialog(control.Scope);
                          
      if (dlg.ShowDialog()== DialogResult.OK)
                          
      {
                              value 
      = dlg.Scope;
                              
      return value;
                          }

                      }

                  }


                  
      return value;
              }

          }

      }


             在這個類里,我們重寫了兩個方法,一個是GetEditStyle,在這個方法里,我們通知開發環境,屬性的編輯器是一個模態對話框。另一個方法是EditValue,這是最核心的方法,在這個方法里,我們通過上下文環境獲得了正在編輯的控件的實例,并將實例的Scope屬性傳遞給屬性編輯對話框,顯示對話框供用戶編輯屬性的值,用戶編輯完屬性的值,并關閉對話框,這時,我們從對話框里獲取編輯后的結果反會給開發環境。       編寫完Editor,我們就要將它應用到MyListControlScope屬性上,現在的Scope屬性定義如下:
            
      [Browsable(true)]
              [Editor(
      typeof(ScopeEditor),typeof(UITypeEditor))]
              
      public Scope Scope
              
      {
                  
      get
                  
      {
                      
      return _scope;
                  }

                  
      set
                  
      {
                      _scope 
      = value;
                  }

              }

                   我們在Scope屬性前加上了[Editor(typeof(ScopeEditor),typeof(UITypeEditor))]元數據。Build工程,查看實際的效果。在測試工程的窗體上,選中控件,觀察Scope屬性,當我們單擊Scope屬性的值時,在屬性值的后邊出現了一個按鈕,如圖:
                   

            當我們點擊這個按鈕后,彈出了屬性編輯的對話框,如圖:
            
            我們在對話框里編輯屬性的值,并點擊OK關閉對話框,現在Scope屬性值已經被修改了。

      posted @ 2006-12-18 20:28  綸巾客  閱讀(13026)  評論(17)    收藏  舉報
      主站蜘蛛池模板: 湄潭县| 精品在免费线中文字幕久久| 国色天香成人一区二区| 男人一天堂精品国产乱码| 伊大人香蕉久久网欧美| 亚洲综合色婷婷中文字幕| 放荡的少妇2欧美版| 国产蜜臀在线一区二区三区| 亚洲国产欧美一区二区好看电影| 起碰免费公开97在线视频| 国产免费午夜福利在线播放| 永久免费精品性爱网站| 成人免费在线播放av| 国产精品免费无遮挡无码永久视频| 粉嫩一区二区三区粉嫩视频| 2021亚洲国产精品无码| VA在线看国产免费| 国产精品日韩av一区二区| 人与禽交av在线播放| 亚洲 日韩 国产 制服 在线| 色综合色天天久久婷婷基地| 国产精品一区在线蜜臀| 又大又粗又硬又爽黄毛少妇| 在线精品视频一区二区三四| 色综合天天综合网天天看片| 久久精品国产免费观看频道| 国产一区二区三区精品久| 不卡乱辈伦在线看中文字幕| 麻豆国产va免费精品高清在线| 乱人伦中文字幕成人网站在线| 亚洲中文字幕无码爆乳APP| 综合色天天久久| 国产精品久久久久7777按摩| 男人扒女人添高潮视频| 爆乳女仆高潮在线观看| 亚洲精品不卡无码福利在线观看| 乱人伦人妻中文字幕在线| 日韩精品中文字幕无码一区| 偷拍久久大胆的黄片视频| 国产欧美日韩亚洲一区二区三区 | 在线看免费无码av天堂|