C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: カスタムコントロールのプロパティウィンドウを操作したい


(過去ログ 80 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■47108 / inTopicNo.1)  カスタムコントロールのプロパティウィンドウを操作したい
  
□投稿者/ とらじゃ (1回)-(2010/02/18(Thu) 15:03:51)

分類:[C#] 

はじめまして

現在 VS2008 C# での開発を行っています


例えば、FlowLayoutPanel を継承したカスタムコントロールを作成するとします
その中に TextBox を配置し、TextBox の KeyPress イベントを透過的にカスタムコントロールの
KeyPress イベントとしたいと思いました


その際単純に「KeyPress」と云う名称そのままにイベントを宣言する事ができませんので、

public new event KeyPressEventHandler KeyPress;

と云う様に、むりやり覆いかぶせてしまえば、取り敢えずは目的は達成される事は確認しました
しかし、デザイナのプロパティウィンドウで「KeyPress」イベントが表示されません


この状況は FlowLayoutPanell が KeyPress イベントを隠し持っている(表現が良くないかな?)
為で、具体的には ControlDesigner を利用してKeyPress プロパティを Remove しているものと
考えています



そこで、質問になります

この様に親が削除してしまったプロパティを、子供側で再度復活させる
或いは、
親に削除しない様にお願いする

事は出来ないでしょうか?



もちろん余計な事を考えずに、Keypress イベント辺りで手をうつ、と云う選択肢もありますが、
透過的に投げちゃうんで、同じ名前の方が良いなぁ、と云う思いもあって…


宜しくお願い致します
引用返信 編集キー/
■47627 / inTopicNo.2)  Re[1]: カスタムコントロールのプロパティウィンドウを操作したい
□投稿者/ 魔界の仮面弁士 (1536回)-(2010/03/10(Wed) 06:10:17)
No47108 (とらじゃ さん) に返信
> 例えば、FlowLayoutPanel を継承したカスタムコントロールを作成するとします
> その中に TextBox を配置し、TextBox の KeyPress イベントを透過的にカスタムコントロールの
> KeyPress イベントとしたいと思いました

こういう感じでしょうか。

//----------------------------------------------------
// 予め配置してある TextBox の KeyPress のみを拾う場合
//----------------------------------------------------
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

[DefaultEvent("KeyPress")]
public class FlowPanelSample : FlowLayoutPanel
{
    private TextBox textBox1;
    public FlowPanelSample()
    {
        textBox1 = new TextBox() { Name = "textBox1" };
        textBox1.KeyPress += (object sender, KeyPressEventArgs e) => this.OnKeyPress(e);
        Controls.Add(textBox1);
    }
}

//-----------------------------------------------------------
// 利用者によって配置されたコントロールの KeyPress を拾う場合
//-----------------------------------------------------------
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

[DefaultEvent("KeyPress")]
public class FlowPanelSample : FlowLayoutPanel
{
    public FlowPanelSample()
    {
        ControlRemoved += delegate(object sender, ControlEventArgs e) { e.Control.KeyPress -= Controls_KeyPress; };
        ControlAdded += delegate(object sender, ControlEventArgs e) { e.Control.KeyPress += Controls_KeyPress; };
    }

    private void Controls_KeyPress(object sender, KeyPressEventArgs e)
    {
        OnKeyPress(e);
    }
}


> しかし、デザイナのプロパティウィンドウで「KeyPress」イベントが表示されません
Panel 系クラスの KeyPress イベントは、デザイナ上で非表示となるよう、あえて
 [Browsable(false)]
 [EditorBrowsable(EditorBrowsableState.Never)]
の属性が付与されているためです。

デザイナのサポートが必要であれば、KeyPress イベントを再定義して、そこに
 [Browsable(true)]
 [EditorBrowsable( EditorBrowsableState.Always)]
の属性指定を行ってみてください。デザイナ上に表示されるようになります。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -