none
コントロールのデフォルト値 RRS feed

  • 質問

  • 宜しくお願いいたします。

    VisualStudioにて使用する各種コントロールについて配置時に
    各コントロールのAutosizeや属性を都度設定するのですが

    これらのデフォルト値をカスタマイズ登録することは出来ないのでしょうか?

    2015年7月9日 7:59

回答

  • デフォルト値は決まっており、それを変更するのは難しいと思います。もし、変更できてしまうと、デフォルト値がヘルプに記載されていればそれと異なることになり、混乱の元になりかねません。
    もしやるとすれば、継承してカスタムコントロールを作成するか、実行時にコードで一括して設定するようにしてしまえば良いように思います。以下のようにしてフォーム上の全てのコントロールにアクセスできます。

    第20回 コントロールをまとめる方法
    http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard20.htm


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年7月15日 4:40
    • 回答としてマーク taskplan 2015年7月15日 8:26
    2015年7月9日 8:56
    モデレータ

すべての返信

  • デフォルト値は決まっており、それを変更するのは難しいと思います。もし、変更できてしまうと、デフォルト値がヘルプに記載されていればそれと異なることになり、混乱の元になりかねません。
    もしやるとすれば、継承してカスタムコントロールを作成するか、実行時にコードで一括して設定するようにしてしまえば良いように思います。以下のようにしてフォーム上の全てのコントロールにアクセスできます。

    第20回 コントロールをまとめる方法
    http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard20.htm


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年7月15日 4:40
    • 回答としてマーク taskplan 2015年7月15日 8:26
    2015年7月9日 8:56
    モデレータ
  • 変態的なやり方を考えてみた

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
        }
    
        //このパネルをフォームに貼り付けてそこにコントロールを追加していく
        class PanelEx : Panel
        {
            protected override void OnControlAdded(ControlEventArgs e)
            {
                base.OnControlAdded(e);
                if (this.DesignMode)
                {
                    DesignTimeInitializer.ControlAdded(e.Control);
                }
            }
    
            protected override void OnControlRemoved(ControlEventArgs e)
            {
                if (this.DesignMode)
                {
                    DesignTimeInitializer.ControlRemoved(e.Control);
                }
                base.OnControlRemoved(e);
            }
        }
    
        class DesignTimeInitializer
        {
            #region 弱参照で既存コントロールを保持
            private static Dictionary<Type, List<WeakReference>> dic = new Dictionary<Type, List<WeakReference>>();
    
            private static void RefreshReferences()
            {
                foreach (List<WeakReference> list in dic.Values)
                {
                    for (int i = list.Count - 1; i >= 0; --i)
                    {
                        if (!list[i].IsAlive)
                        {
                            list.RemoveAt(i);
                        }
                    }
                }
            }
    
            enum AddResult
            {
                Add = 0,
                Already = 1
            }
            private static AddResult AddReference(Control ctl)
            {
                RefreshReferences();
                Type t = ctl.GetType();
                List<WeakReference> list;
                if (!dic.TryGetValue(t, out list))
                {
                    list = new List<WeakReference>();
                    dic.Add(t, list);
                }
                foreach (WeakReference w in list)
                {
                    if (w.IsAlive && w.Target == ctl)
                    {
                        return AddResult.Already;
                    }
                }
                list.Add(new WeakReference(ctl));
                return AddResult.Add;
            }
            #endregion
    
            private static void ControlAdded(object sender, ControlEventArgs e)
            {
                ControlAdded(e.Control);
            }
    
            private static void ControlRemoved(object sender, ControlEventArgs e)
            {
                ControlRemoved(e.Control);
            }
    
            public static void ControlAdded(Control ctl)
            {
                if (AddReference(ctl) == AddResult.Add)
                {//まだ未登録のコントロール
    
                    ctl.ControlAdded += ControlAdded;
                    ctl.ControlRemoved += ControlRemoved;
    
                    if (ctl is TextBox)
                    {
                        try
                        {
                            ctl.Parent.BeginInvoke((Action<TextBox>)TextBoxCreated, (TextBox)ctl);
                        }
                        catch (System.InvalidOperationException ex)
                        {//デザイン時のフォームを生成したときにBeginInvokeは失敗する
                            //MessageBox.Show(ex.GetType().ToString() + "\r\n" + ex.Message);
                        }
                    }
                }
            }
            public static void ControlRemoved(Control ctl)
            {
                ctl.ControlAdded -= ControlAdded;
                ctl.ControlRemoved -= ControlRemoved;
            }
    
            private static void TextBoxCreated(TextBox textBox)
            {
                TextBox dummy = new TextBox();
                if (dummy.Text == textBox.Text)//デフォルト値の場合のみ変更
                {
                    textBox.Text = "Change";
                }
            }
        }
    }
    #カット&ペーストされると新規作成扱いで失敗ですが

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2015年7月15日 4:40
    2015年7月9日 12:35
  • 標準ではなく、サードパーティーの開発支援製品(PlusPak)の1機能として、そういったものは存在しますね。

    プロパティ設定の管理
    http://www.grapecity.com/tools/products/pluspakwin8/feature#kinou25
    > 設定した値をコントロールのデフォルト値として保存できるため、初期値を変えるだけのために継承コントロールを作成する必要がなくなります。

    2015年7月9日 13:37
    モデレータ
  • trapemiya様
    gekka様
    Azulean様

    ご回答をありがとう御座います。
    毎回LabelのautosizeをOFFにしたり、センタリングを指定したりと細かい事ですが
    悶々としてましたので、質問させて頂きました。

    やはり標準やaddinなどではないんですね。
    出来れば実行時でなく、レイアウト中にこれらが適用されていると感覚もつかみやすいのですから
    カスタムを作成して流用するのがベストなようですね。
    変態的な方法も私的には好みです(笑
    Grapecityは一部では使っているのですが、開発機が増えると負担も大きいので
    ご意見を参考に実践してみて効率的な方法を選びたいと思います。

    皆様、ありがとう御座いました。
    2015年7月15日 8:25