|
■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)]
の属性指定を行ってみてください。デザイナ上に表示されるようになります。
|