DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

継承したコントロールでデザイナを使ってFlowLayoutPanelのプロパティを変更できない問題

注意:FlowLayoutPanel、TableLayoutPanelコントロールは.NET Framework 2.0以降でのみ使用できます。

FlowLayoutPanelコントロールを配置したコントロール(フォームを含む)を継承して新たなコントロールを作成した時、FlowLayoutPanelのModifiersがPublicであったとしても、継承したコントロールでFlowLayoutPanelのプロパティを変更できなくなるという問題があります。これはFlowLayoutPanelだけでなく、TableLayoutPanelやToolStrip、MenuStrip、ContextMenuStrip、StatusStrip、DataGridView、BindingNavigatorコントロールでも起こります。このバグについて詳しくは「Bug Details: Form designer doesn’t allow to modify properties of all new for .Net Framework 2.0 controls」で説明されています。

FlowLayoutPanelについての解決法が「FDBK37485#1: Can manage to use FlowLayoutPanel with some work.」(リンク切れ)で紹介されています。

これによると、FlowLayoutPanelを継承したクラスを作成し、これにdesignerTypeにPanelDesignerを指定したDesigner属性をつけ、これをFlowLayoutPanelの代わりに継承基のコントロールで使用するということです。

具体的には、例えばまず次のようなクラスを作成し、これをFlowLayoutPanelの代わりに使うようにします。

VB.NET
コードを隠すコードを選択
<System.ComponentModel.Designer( _
"System.Windows.Forms.Design.PanelDesigner, System.Design")> _
Public Class InheritableFlowLayoutPanel
    Inherits FlowLayoutPanel

    Public Sub New()
    End Sub
End Class
C#
コードを隠すコードを選択
[Designer("System.Windows.Forms.Design.PanelDesigner, System.Design")]
public class InheritableFlowLayoutPanel : FlowLayoutPanel
{
    public InheritableFlowLayoutPanel()
    {
    }
}
注意:新しく作成したクラスを、基のコントロールクラスの代わりに使用するという意味が分からないという方は、こちらをご覧ください。

残念ながらこれはFlowLayoutPanelだけの解決法で、他のコントロールには使えません。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。