- PR -

ユーザーコントロールの中身をデザイン時に変更したい

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-02-18 15:36
引用:


Jittaさんが提示されたUserControlクラス = 未記入さんがつくられたユーザーコントロール




これはわかるのですが

引用:

ユーザーコントロールに定義したラベル = label1



という前提で
引用:

private Label label1;



これが必須なのかどうかがまずわかりません。
単に「ラベルがあるとすると」という例なのか、何らかの形でフォームの定義と結びつける必要があるのか否かがよくわかっていません。
ユーザーコントロール内で定義したコントロールについてはクラス内で参照できるようなのに敢えてprivateで定義しているので何らかの意味があるのだと思うのですがその意味がわからず迷っています。

それと、一番わからないのは
コード:
    public string Text {


の部分で、なぜこれがピンポイントでlabel1のプロパティということになるのかまったくわかりません。
もしかするとこの書き方はユーザーコントロールのText型のプロパティの定義ということになるのでしょうか?
試しにC#のプロジェクトを作成し、ユーザーコントロールのコードを作って見たのですが
1.label1が重複しているというエラーになる(コメントアウトしました)
2.フォームに貼り付けたユーザーコントロールのプロパティにそれらしい項目を見つけることができませんでした。

コード:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class UserControl1 : UserControl
    {
        //private Label label1;

        public string Text
        // public new string  Text
        // public override string  Text
       {
            set
            {
                label1.Text = value;
            }
            get
            {
                return label1.Text;
            }
        }
        
        public UserControl1()
        {
            InitializeComponent();
        }
    }
}



そもそも、今回頂いている回答の前提条件を理解していないような気がしています。
申し訳ありませんが抜けていそうな部分をご指摘頂けないでしょうか。
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-02-18 15:54
引用:

todoさんの書き込み (2009-02-18 15:32) より:
ユーザー・コントロールにプロパティとメソッドを追加する
http://www.atmarkit.co.jp/fdotnet/vblab/vb2005m_10/vb2005m_10_03.html



教えて頂いたページでは、ラベルに置き換えた場合、実行時にプロパティを通してラベルを書き換える方法しか説明されていないように思えます。
この方法であれば敢えてプロパティを作らなくてもラベルのModifiersをPublicにすることで実現できます。(今はModifiersをPublicにして実現しています)

やりたいのはToshiさんのご指摘
引用:

デザイン時に設定を行なうためには、プロパティのゲッターも必要になりますので、
(デザイナ上でプロパティウィンドウ等に現在の設定値の表示を行なうため。)


の方法なのでもしご存知でしたらご紹介いただけないでしょうか。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2009-02-18 17:34
引用:

教えて頂いたページでは、ラベルに置き換えた場合、実行時にプロパティを通してラベルを書き換える方法しか説明されていないように思えます。


いえ、概念としては同じです。
図11と「IdeaCardコントロールのCategoryTextプロパティを定義する」を
参考にして動作を確認してみてください。

引用:

この方法であれば敢えてプロパティを作らなくてもラベルのModifiersをPublicにすることで実現できます。(今はModifiersをPublicにして実現しています)


デザイナで修正できるのは、あくまで「プロパティ」です。
ですから、敢えてプロパティをつくります。

尚、先のサンプルで
引用:

1.label1が重複しているというエラーになる(コメントアウトしました)
2.フォームに貼り付けたユーザーコントロールのプロパティにそれらしい項目を見つけることができませんでした。


の確認をしたとありますが、
2のそれらしい項目とはどのような項目が存在することを望んでいますか?

先のサンプルではUserControlにTextという名称でプロパティが公開されており、
その値を変更することで、Labelの表示が切り替わるはずです。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-18 17:58
> ひとつのフォームに同じユーザーコントロールを複数貼り付け、各々ラベルを変更したいのですが、各々のラベルをデザイン時に変更することは可能でしょうか?

ラベルの Text をユーザーコントロールのプロパティとして公開すれば出来ます。

> 教えて頂いたページでは、ラベルに置き換えた場合、実行時にプロパティを通してラベルを書き換える方法しか説明されていないように思えます。

その方法で良いんじゃないの?
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-02-18 18:00
引用:

図11と「IdeaCardコントロールのCategoryTextプロパティを定義する」を
参考にして動作を確認してみてください。


プロパティの簡単(本当に初歩的な使い方だと思いますが)な使い方は一応わかっているつもりです。
ですので、図11と「IdeaCardコントロールのCategoryTextプロパティを定義する」については一応理解できてるつもりです。
しかしデザイナーでプロパティを変更するやり方がわからず、実行時に値を書き換えるというやり方をしているため、ModifiersをPublicにして実行時に値を書き換えることと、プロパティを定義して実行時に値を書き換えることは(実行時に書き換える点で)同じ結果になると書かせて頂きました。
このことは秀和システムのVisualBasic2008逆引き大全にも書かれています。

しかしデザイナーで変更することができればまったく状況が異なってきますので、Toshiさんの言われているようにプロパティでなければならないということに異論を挟むつもりは毛頭ありません。

引用:

2のそれらしい項目とはどのような項目が存在することを望んでいますか?

先のサンプルではUserControlにTextという名称でプロパティが公開されており、
その値を変更することで、Labelの表示が切り替わるはずです。




私の場合はTextというプロパティを作ったので、デザイナーのプロパティウインドウにTextというプロパティが追加されるのかなと思ったのですが見つけられませんでした。

未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-02-18 18:07
引用:

Kingさんの書き込み (2009-02-18 17:58) より:
> ひとつのフォームに同じユーザーコントロールを複数貼り付け、各々ラベルを変更したいのですが、各々のラベルをデザイン時に変更することは可能でしょうか?

ラベルの Text をユーザーコントロールのプロパティとして公開すれば出来ます。

> 教えて頂いたページでは、ラベルに置き換えた場合、実行時にプロパティを通してラベルを書き換える方法しか説明されていないように思えます。

その方法で良いんじゃないの?



もしかしてピントはずれな質問をしているのでしょうか?
私が期待しているのは、例えばフォームにラベルを配置した時、プロパティウインドウでTextプロパティを書き換えるようにユーザーコントロールに追加したプロパティを書き換えることなのですが・・・
Toshiさんの回答はそれができると教えて頂いていると思っていますが勘違いでしょうか?
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-18 18:26
もしかして私が読み違えてる?

> フォームにラベルを配置した時、プロパティウインドウでTextプロパティを書き換えるように
> ユーザーコントロールに追加したプロパティを書き換えることなのですが・・・

1.ユーザーコントロールに自分でプロパティを作成する。( LabelText とか自由な名前で)
2.その LabelText プロパティとユーザーコントロール内のラベルの Text プロパティを関連付ける。
3.デザイナでユーザーコントロールの LabelText プロパティを設定すると
  ユーザーコントロール内のラベルの Text プロパティも設定される。

コード:

Public Class UserControl1
    Inherits System.Windows.Forms.UserControl
    
    <略>
    
    Private WithEvents Label1 As System.Windows.Forms.Label

    <略>

    Me.Label1 = New System.Windows.Forms.Label

    <略>

    ' ラベルの文字列を表すプロパティ
    <Browsable(True)> _
    Public Property LabelText() As String
        Set(ByVal value As String)
            Label1.Text = value
        End Set
        Get
            Return Label1.Text
        End Get
    End Property
End Class



今、書いて思いましたが BrowsableAttribute がわからなかったって話でしょうか?
http://msdn.microsoft.com/ja-jp/library/system.componentmodel.browsableattribute(VS.80).aspx
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2009-02-18 18:45
方法については、Kingさんがかかれてますが、以下念のため。
引用:

<略>

Private WithEvents Label1 As System.Windows.Forms.Label

<略>

Me.Label1 = New System.Windows.Forms.Label

<略>


この部分はデザイナ上でLabelを貼り付ければVSが自動生成するはずです。
なので、Labelをデザイナで貼り付けたあとに、
引用:

Public Property LabelText() As String
Set(ByVal value As String)
Label1.Text = value
End Set
Get
Return Label1.Text
End Get
End Property


と、プロパティを追加してみてください。

引用:

今、書いて思いましたが BrowsableAttribute がわからなかったって話でしょうか?


初期 true じゃありませんでしたっけ?

UserControlとFormは同じプロジェクトなら、ビルドしてなくて表示されないと
いうことは考えられるんですけどね・・・
※でも警告がでたはずですね・・

[ メッセージ編集済み 編集者: Toshi 編集日時 2009-02-18 18:45 ]

スキルアップ/キャリアアップ(JOB@IT)