none
Properties.Settings の値を違うプロジェクトから更新したい RRS feed

  • 質問

  • TestMainプロジェクトに設定したプロパティの値を違うDialogプロジェクトから更新したいのですがうまくいきません。

    TestMain.Properties.Settings.Default.ID に "Dialog_FormClosing" に更新してほしいのですが

    DialogForm のコンストラクタでもらった ref  id に 直接代入した "DialogForm Constructor" に更新されます。

    メンバー変数 _ID = id ;   の部分で参照渡しになっていない? のか Dialog_FormClosing() で _ID を書き換えてもうまくいきません。


    どのような対応方法があるのかアドバイスのほどよろしくお願いします。

    namespace TestMain
    {
    	public partial class TestMainForm : Form
    	{
    		private string _ID;
    
    		public TestMainForm()
    		{
    			InitializeComponent();
    		}
    
    		private void button1_Click(object sender, EventArgs e)
    		{
    			_ID = TestMain.Properties.Settings.Default.ID;
    			// new Dialog.DialogForm(ref TestMain.Properties.Settings.Default.ID).ShowDialog(); はエラーになる
    			new Dialog.DialogForm(ref _ID).ShowDialog();
    			TestMain.Properties.Settings.Default.ID = _ID;  
    			
    			// "DialogForm Constructor" がセットされる。
    			// "Dialog_FormClosing" をセットしてほしい。
    		}
    	}
    }
    
    
    namespace Dialog
    {
    	public partial class DialogForm : Form
    	{
    		private string _ID;
    
    		public DialogForm()
    		{
    			InitializeComponent();
    		}
    
    		public DialogForm(ref string id)
    		{
    			InitializeComponent();
    
    			id = "DialogForm Constructor";
    			_ID = id;
    			textBoxID.Text = id;
    		}
    
    		private void Dialog_FormClosing(object sender, FormClosingEventArgs e)
    		{
    			// ダイアログのtextBoxID.Textに "Dialog_FormClosing" を入力する
    			_ID = textBoxID.Text;
    		}
    	}
    }
    


    2015年10月26日 2:43

回答

  • こんにちは。

    タイトルから、外部ライブラリからメインプロジェクトの設定ファイルを参照したい、
    という話かと思ったのですが、そうではなくそれを実現するために外部ライブラリ側へ変数を参照渡ししたのちにメインプロジェクトで設定ファイルは更新するんですね。

    ご認識されているとおりrefキーワードは呼び出し元が参照先を更新するためのものですので、
    refキーワードを使わずにClassでラップして渡すのが簡単だと思いますが。

    namespace TestMain
    {
        public partial class TestMainForm : Form
        {
            //private string _ID;
            public TestMainForm()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //_ID = TestMain.Properties.Settings.Default.ID;
                //new Dialog.DialogForm(ref _ID).ShowDialog();
                //TestMain.Properties.Settings.Default.ID = _ID;
                Dialog.DialogIFParam param = new Dialog.DialogIFParam();
                param.ID = TestMain.Properties.Settings.Default.ID;
    
                new Dialog.DialogForm(param).ShowDialog();
                TestMain.Properties.Settings.Default.ID = param.ID;
            }
        }
    }
    namespace Dialog
    {
        public partial class DialogForm : Form
        {
            //private string _ID;
            private DialogIFParam param;
    
            public DialogForm()
            {
                InitializeComponent();
            }
    
            //public DialogForm(ref string id)
            public DialogForm(DialogIFParam _param)
            {
                InitializeComponent();
    
                //id = "DialogForm Constructor";
                //_ID = id;
                //textBoxID.Text = id;
                _param.ID = "DialogForm Constructor";
                param = _param;
                textBoxID.Text = _param.ID;
            }
    
            private void DialogForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                textBoxID.Text = "Dialog_FormClosing";
                //_ID = textBoxID.Text;
                param.ID = textBoxID.Text;
            }
        }
    
        public class DialogIFParam
        {
            public string ID { get; set; }
        }
    }
    

    • 回答としてマーク bakabon88 2015年10月26日 4:54
    2015年10月26日 3:42
    モデレータ
  • refとoutが指定された引数は、その関数内でしか有効ではないので、bakabon88さんのコードではコンストラクタ内でしか有効ではありません。
    どうしてもrefで受け取る必要があるならコンストラクタ以外で行う必要があります。

    using System;
    using System.Windows.Forms;
    
    namespace Dialog
    {
        public partial class DialogForm : Form
        {
            private string _ID;
    
            public DialogForm()
            {
                InitializeComponent();
            }
    
            private DialogForm(string id)
            {
                InitializeComponent();
    
                id = "DialogForm Constructor";
                _ID = id;
                textBoxID.Text = id;
            }
    
            private void Dialog_FormClosing(object sender, FormClosingEventArgs e)
            {
                // ダイアログのtextBoxID.Textに "Dialog_FormClosing" を入力する
                _ID = textBoxID.Text;
            }
    
            public static void ShowDialog(ref string id)
            {
                using(var df=new DialogForm(id) )
                {
                    df.ShowDialog();
                    id = df._ID;
                }
            }
        }
    }
    namespace TestMain
    {
        public partial class TestMainForm : Form
        {
            private string _ID;
    
            public TestMainForm()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _ID = TestMain.Properties.Settings.Default.ID;
                Dialog.DialogForm.ShowDialog(ref _ID);
                TestMain.Properties.Settings.Default.ID = _ID;
    
            }
        }
    }



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

    • 回答としてマーク bakabon88 2015年10月26日 4:54
    2015年10月26日 3:43

すべての返信

  • こんにちは。

    タイトルから、外部ライブラリからメインプロジェクトの設定ファイルを参照したい、
    という話かと思ったのですが、そうではなくそれを実現するために外部ライブラリ側へ変数を参照渡ししたのちにメインプロジェクトで設定ファイルは更新するんですね。

    ご認識されているとおりrefキーワードは呼び出し元が参照先を更新するためのものですので、
    refキーワードを使わずにClassでラップして渡すのが簡単だと思いますが。

    namespace TestMain
    {
        public partial class TestMainForm : Form
        {
            //private string _ID;
            public TestMainForm()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //_ID = TestMain.Properties.Settings.Default.ID;
                //new Dialog.DialogForm(ref _ID).ShowDialog();
                //TestMain.Properties.Settings.Default.ID = _ID;
                Dialog.DialogIFParam param = new Dialog.DialogIFParam();
                param.ID = TestMain.Properties.Settings.Default.ID;
    
                new Dialog.DialogForm(param).ShowDialog();
                TestMain.Properties.Settings.Default.ID = param.ID;
            }
        }
    }
    namespace Dialog
    {
        public partial class DialogForm : Form
        {
            //private string _ID;
            private DialogIFParam param;
    
            public DialogForm()
            {
                InitializeComponent();
            }
    
            //public DialogForm(ref string id)
            public DialogForm(DialogIFParam _param)
            {
                InitializeComponent();
    
                //id = "DialogForm Constructor";
                //_ID = id;
                //textBoxID.Text = id;
                _param.ID = "DialogForm Constructor";
                param = _param;
                textBoxID.Text = _param.ID;
            }
    
            private void DialogForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                textBoxID.Text = "Dialog_FormClosing";
                //_ID = textBoxID.Text;
                param.ID = textBoxID.Text;
            }
        }
    
        public class DialogIFParam
        {
            public string ID { get; set; }
        }
    }
    

    • 回答としてマーク bakabon88 2015年10月26日 4:54
    2015年10月26日 3:42
    モデレータ
  • refとoutが指定された引数は、その関数内でしか有効ではないので、bakabon88さんのコードではコンストラクタ内でしか有効ではありません。
    どうしてもrefで受け取る必要があるならコンストラクタ以外で行う必要があります。

    using System;
    using System.Windows.Forms;
    
    namespace Dialog
    {
        public partial class DialogForm : Form
        {
            private string _ID;
    
            public DialogForm()
            {
                InitializeComponent();
            }
    
            private DialogForm(string id)
            {
                InitializeComponent();
    
                id = "DialogForm Constructor";
                _ID = id;
                textBoxID.Text = id;
            }
    
            private void Dialog_FormClosing(object sender, FormClosingEventArgs e)
            {
                // ダイアログのtextBoxID.Textに "Dialog_FormClosing" を入力する
                _ID = textBoxID.Text;
            }
    
            public static void ShowDialog(ref string id)
            {
                using(var df=new DialogForm(id) )
                {
                    df.ShowDialog();
                    id = df._ID;
                }
            }
        }
    }
    namespace TestMain
    {
        public partial class TestMainForm : Form
        {
            private string _ID;
    
            public TestMainForm()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _ID = TestMain.Properties.Settings.Default.ID;
                Dialog.DialogForm.ShowDialog(ref _ID);
                TestMain.Properties.Settings.Default.ID = _ID;
    
            }
        }
    }



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

    • 回答としてマーク bakabon88 2015年10月26日 4:54
    2015年10月26日 3:43
  • Tak1waさん

    こんにちは。

    クラスで受け渡しをするんですね

    一番わかりやすくシンプルですね

    ありがとうございました。

    2015年10月26日 5:24
  • gekkaさん

    こんにちは。

     > refとoutが指定された引数は、その関数内でしか有効ではないので、bakabon88さんのコードではコンストラクタ内でしか有効ではありません。

    そうだったんですね、勉強になりました。

    サンプルコードがとても参考になりました。

    ありがとうございました。

    2015年10月26日 5:29