すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,650,076  昨日:000,000,268  本日:000,000,029
Loading
プロパティグリッド
.NET プログラミング
プロパティグリッド
印刷
リストボックス
スレッド
リストビュー
インストーラー
やってみよう!

できるVisual Studio 2015 Windows /Android/iOS アプリ対応

独習C# 第3版

VisualBasic2013パーフェクトマスター (Perfect Master SERIES)

プログラミング.NET Framework 第4版 (Microsoft Press)

VisualBasic2013逆引き大全555の極意

猫でもわかるWindowsプログラミング 第4版 (猫でもわかるプログラミング)

VisualC#2013逆引き大全555の極意

プロパティの編集画面① 最終更新:2010/07/22
【Amazon ランキング:ゲーム - プレイステーション4】

始めの章で Color型のプロパティをプロパティグリッドに設定していましたが、そのとき色を選択するダイアログが表示されていたことを覚えているでしょうか?
じつはこのダイアログ、自分で自由に作ることができるのです。プロパティ編集用のダイアログを表示させることによってユーザーインターフェイスを格段に向上させることができます。ここではその実装方法について説明します。
ユーザーインターフェイスの作成
まずはプロパティの編集に使うユーザーインターフェイスを作成します。
プロジェクトの新しい項目の追加でユーザーコントロール「UserControl1」を作成してください。
使用するコントロールは次の3つです。

MonthCalender:[monthCalendar1]
Label:[label1]
TextBox:[textBox1]

それぞれのコントロールを左のイメージのように配置してください。
プロパティの値はすべてデフォルトを使用します。
VB[UserControl1.cs]
' Public Class UserControl1

    
' Class2 値プロパティ
    Public Property Class2Value() As Class2
        
Get
            Return New Class2(Me.monthCalendar1.SelectionStart, Me.textBox1.Text)
        
End Get
        Set(ByVal value As Class2)
            
Me.monthCalendar1.SelectionStart = value.BirthDay
            
Me.textBox1.Text = value.Name
        
End Set
    End Property

End
 Class
C#[UserControl1.cs]
namespace PropatyGrid_CS
{
    
public partial class UserControl1 : UserControl
    {
        
public UserControl1()
        {
            InitializeComponent();
        }

        
// Class2 値プロパティ
        public Class2 Class2Value
        {
            
get
            {
                
return new Class2(this.monthCalendar1.SelectionStart, this.textBox1.Text);
            }
            
set
            {
                
this.monthCalendar1.SelectionStart = value.Birthday;
                
this.textBox1.Text = value.Name;
            }
        }
    }
}
エディタクラスの作成
ユーザーインターフェイス画面ができた後は、プロパティと画面をつなげるエディタクラスを作成します。
エディタクラスは [System.Drawing.Design.UITypeEditor]から派生させて次のメソッドをオーバーライドして記述します。
編集スタイルの編集モードを取得するメソッドです。

[VB]
Public Overrides Function GetEditStyle( _
    
ByVal context As System.ComponentModel.ITypeDescriptorContext) _
    
As System.Drawing.Design.UITypeEditorEditStyle

[C#]
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(
    System.ComponentModel.
ITypeDescriptorContext context){


編集画面を表示して変更された値を取得するメソッドです。

[VB]
Public Overrides Function EditValue( _
    
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
    
ByVal provider As System.IServiceProvider, _
    
ByVal value As ObjectAs Object

[C#]
public override object EditValue(
    System.ComponentModel.
ITypeDescriptorContext context,
    
IServiceProvider provider,
    
object value){
VB[Class2Editor.vb]
Imports System.Windows.Forms.Design

Public Class Class2Editor
    
Inherits System.Drawing.Design.UITypeEditor

    
' 編集用ユーザーコントロール
    Private _editorUi As UserControl1 = Nothing

    ' 編集スタイルの取得
    Public Overrides Function GetEditStyle( _
        
ByVal context As System.ComponentModel.ITypeDescriptorContext) _
        
As System.Drawing.Design.UITypeEditorEditStyle

        
' ドロップダウンスタイル
        Return System.Drawing.Design.UITypeEditorEditStyle.DropDown

    
End Function

    ' 値の編集
    Public Overrides Function EditValue( _
        
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
        
ByVal provider As System.IServiceProvider, _
        
ByVal value As ObjectAs Object

        ' エディタサービスの取得
        Dim editservice As IWindowsFormsEditorService = _
            provider.GetService(
GetType(IWindowsFormsEditorService))

        
' 編集用のユーザーインターフェイス作成
        If _editorUi Is Nothing Then
            _editorUi = New UserControl1
        
End If

        ' コントロールに値を設定
        _editorUi.Class2Value = DirectCast(value, Class2)

        
' 編集用のコントロールを設定
        editservice.DropDownControl(_editorUi)

        
' 編集された値を返す
        Return _editorUi.Class2Value

    
End Function

End
 Class
C#[Class2Editor.cs]
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms.Design;

namespace PropatyGrid_CS 
{
    
public class Class2Editor:System.Drawing.Design.UITypeEditor 
    {

        
// 編集用ユーザーコントロール
        private UserControl1 _editerUi = null;

        
// 編集用ユーザーコントロール
        public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(
            System.ComponentModel.
ITypeDescriptorContext context)
        {
            
// ドロップダウンスタイル
            return System.Drawing.Design.UITypeEditorEditStyle.DropDown;
        }

        
// 値の編集
        public override object EditValue(
            System.ComponentModel.
ITypeDescriptorContext context,
            
IServiceProvider provider,
            
object value)
        {
            
            
// エディタサービスの取得
            IWindowsFormsEditorService editservice =
                (
IWindowsFormsEditorService)provider.GetService(
                    
typeof(IWindowsFormsEditorService));

            
// 編集用のユーザーインターフェイス作成
            if (_editerUi == null)
            {
                _editerUi = 
new UserControl1();
            }

            
// コントロールに値を設定
            _editerUi.Class2Value = value as Class2;

            
// 編集用のコントロールを設定
            editservice.DropDownControl(_editerUi);

            
// 編集された値を返す
            return _editerUi.Class2Value;
        }
    }
}
Class2の方では System.ComponentModel.Editor属性で上で作成したエディタクラスとの関連付けを行います。
[VB]
<System.ComponentModel.Editor(GetType(Class2Editor), _
    
GetType(System.Drawing.Design.UITypeEditor))>

[C#]
[System.ComponentModel.Editor(typeof(Class2Editor),
    typeof
(System.Drawing.Design.UITypeEditor ))]
VB[Class2.vb]
<System.ComponentModel.Editor(GetType(Class2Editor), _
                              
GetType(System.Drawing.Design.UITypeEditor))> _
<System.ComponentModel.TypeConverter(
GetType(Class2PropertyConverter))> _
Public Class Class2

    
' クラスメンバ変数
    Private _birthday As DateTime = Now
    
Private _name As String = "SuraSura"

    ' コンストラクタ
    Public Sub New(ByVal birthday As DateTime, ByVal name As String)

        
' メンバ変数初期化
        _birthday = birthday
        _name = name

    
End Sub

    ' 誕生日プロパティ
    <System.ComponentModel.Category("すらすら")> _
    <System.ComponentModel.Description(
"誕生日")> _
    
Public Property BirthDay() As String
        Get
            Return _birthday
        
End Get
        Set(ByVal value As String)
            _birthday = value
        
End Set
    End Property

    ' 名前プロパティ
    <System.ComponentModel.Category("すらすら")> _
    <System.ComponentModel.Description(
"名前")> _
    
Public Property Name() As String
        Get
            Return _name
        
End Get
        Set(ByVal value As String)
            _name = value
        
End Set
    End Property

    ' 文字列の取得
    Public Overrides Function ToString() As String

        Return String.Format("{0:yyyy/MM/dd},{1}", _birthday, _name)

    
End Function

End
 Class
C#[Class2.cs]
using System;
using System.Collections.Generic;
using System.Text;

namespace PropatyGrid_CS
{
    [System.ComponentModel.
Editor(typeof(Class2Editor),
        
typeof(System.Drawing.Design.UITypeEditor ))]
    [System.ComponentModel.
TypeConverter(typeof(Class2PropertyConverter))]
    
public class Class2
    {
        
// クラスメンバ変数
        private DateTime _birthday = DateTime.Now;
        
private string _name = "すらすら";

        
// コンストラクタ
        public Class2(DateTime birthday, string name)
        {
            
// メンバ変数初期化
            _birthday = birthday;
            _name = name;
        }

        
// 誕生日プロパティ
        public DateTime Birthday
        {
            
get { return _birthday; }
            
set { _birthday = value; }
        }

        
// 名前プロパティ
        public string Name
        {
            
get { return _name; }
            
set { _name = value; }
        }

        
// 文字列の取得
        public override string ToString()
        {
            
return string.Format("{0:yyyy/MM/dd},{1}", _birthday, _name);
        }
    }
}
Class3 は前回と同じで変更はありません。
VB[Class3.vb]
Public Class Class3

    
' クラスメンバ変数
    Private _class2 As Class2 = New Class2()

    
' Class2値プロパティ
    <System.ComponentModel.Category("すらすら")> _
    <System.ComponentModel.Description(
"Class2 値のプロパティ")> _
    
Public Property Class2Value() As Class2
        
Get
            Return _class2
        
End Get
        Set(ByVal value As Class2)
            _class2 = value
        
End Set
    End Property

End
 Class
C#[Class3.cs]
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace PropatyGrid_CS
{
    
public class Class3
    {
        
// クラスメンバ変数
        private Class2 _class2 = new Class2();

        
// Class2値プロパティ
        [System.ComponentModel.Category("すらすら")]
        [System.ComponentModel.
Description("Class2値プロパティ")]
        
public Class2 Class2Value
        {
            
get { return _class2; }
            
set { _class2 = value; }
        }
    }
}
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

【楽天 ランキング:パソコン・周辺機器 - ネットワーク機器】




このサイトはフリーソフトのMerge HTMLで作成されています。
このサイトはリンクフリーです。

ページの先頭に戻る Copyright© 2010-2015 Jun.Shiozaki All rights reserved.