こんにちは。
以下のように、大量の設定項目があり、それをユーザーが微調整できるようにしたいと思っています。
ちなみにその設定の保存、読み込みはManySettingインスタンスのシリアライズ/デシリアライズで別途行おうと考えています。
C#
1 class ManySetting 2 { 3 float CarWidth; 4 float CarHeight; 5 float CarWeight; 6 float CarLength; 7 float CarPrice; 8 float CarHoge; 9 //.....といったような変数が100個あります 10 } 11
これらに対してフォームデザイナーで手作業でNumericUpDownを配置するのは手間がかかるので、動的にコントロールのリストを生成し、適当なPanel(panelTekitou)のControlsに追加しようと思いました。
C#
1void SettingInitialize(){ 2 3 List<Control> controls = new List<Control>(); 4 5 AddNumericUpDownToControlList( 6 controls, 7 "車の幅", 8 (decimal)2.0,(decimal)0.001,(decimal)0.001,3, 9 ref manySettingInstance.CarWidth); 10 AddNumericUpDownToControlList( 11 controls, 12 "車の高さ", 13 (decimal)2.0,(decimal)0.001,(decimal)0.001,3, 14 ref manySettingInstance.CarWidth); 15 //などなど100個続く 16 17 panelTekitou.Controls.AddRange(controls.ToArray()); 18 19 } 20 21 22 int settingCount = 0; 23 24 internal void AddNumericUpDownToControlList(List<Control> controls, string description, decimal max, decimal min, decimal increment, int decimalPlaces, 25 ref float targetObj) 26 { 27 28 NumericUpDown nu = new NumericUpDown(); 29 nu.Width = 60; 30 nu.Increment = increment; 31 nu.Maximum = max; 32 nu.Minimum = min; 33 nu.DecimalPlaces = decimalPlaces; 34 nu.Location = new Point(0, settingCount * 20); 35 nu.ValueChanged += new EventHandler(numericUpDownAnySetting_ValueChanged); 36 nu.Tag = targetObj; 37 if (targetObj is float fl) 38 { 39 decimal de = (decimal)fl; 40 if (de >= min && de <= max) 41 { 42 nu.Value = (decimal)fl; 43 } 44 } 45 46 47 Label lblDesc = new Label(); 48 lblDesc.TextAlign = ContentAlignment.MiddleLeft; 49 lblDesc.AutoSize = true; 50 lblDesc.Text = (settingCount + 1).ToString() + " " + description; 51 lblDesc.Location = new Point(80, settingCount * 20); 52 lblDesc.BackColor = Color.FromArgb(240, 240, 240); 53 54 controls.Add(nu); 55 controls.Add(lblDesc); 56 57 settingCount++; 58 } 59 60 61 /// <summary> 62 /// 設定の変更のイベント 63 /// </summary> 64 /// <param name="sender"></param> 65 /// <param name="e"></param> 66 private void numericUpDownAnySetting_ValueChanged(object sender, EventArgs e) 67 { 68 if (sender is NumericUpDown nu) 69 { 70 nu.Refresh(); //再描画 71 72 if (nu.Tag is float) 73 { 74 nu.Tag = (float)nu.Value; 75 } 76 } 77 } 78 79
その後ですが、
NumericUpDownのTagに割り当てた変数が値渡しになってしまうようで、希望の設定インスタンスに反映することができません。
refキーワードを随所にこれでもかと散りばめているのは、参照して欲しくてつけた為です。
稚拙な内容かもしれませんが紐付けするためのアドバイスを頂けると幸いです。
よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/15 06:28