【C#】WindowsForm にチェックボックスを動的に配置してみる
おはようございます。
今回はちょっと久しぶりにC#の話し。
あまり使いどころがあるかわかりませんが、
あるデータを元にチェックボックスを等間隔に動的配置する方法を試してみました。
スポンサーリンク
プロジェクト新規作成
今回は新規でプロジェクトを作成します。
Visual Studio を起動して、「ファイル」>「新規」からプロジェクトを作成してください。
画面の作成
「Label」、「TableLayoutPanel」、「Button」を配置します。
TableLayoutPanelによって、均等にチェックボックスを並べていくようになります。
プログラム
クラス追加
チェックボックスのデータを保持するクラスの追加
Option.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceSampleCheckBoxDynamicArrangement { /// <summary> /// 選択肢クラス /// </summary> classOption { /// <summary> /// チェックされているかどうか /// </summary> publicBooleanIsChecked{set;get;} /// <summary> /// 表示テキスト /// </summary> publicStringText{set;get;} /// <summary> /// 値 /// </summary> publicStringValue{set;get;} } } |
メインの処理
Form1.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Windows.Forms; namespaceSampleCheckBoxDynamicArrangement { publicpartial classForm1:Form { privateinttoggleFlg=0; /// <summary> /// 選択肢リスト /// </summary> privateList<Option>options=newList<Option>{ newOption{IsChecked=false,Text="チェック1",Value="0"}, newOption{IsChecked=false,Text="チェック2",Value="1"}, newOption{IsChecked=false,Text="チェック3",Value="2"}, newOption{IsChecked=false,Text="チェック4",Value="3"}, newOption{IsChecked=false,Text="チェック5",Value="4"}, newOption{IsChecked=false,Text="チェック6",Value="5"}, newOption{IsChecked=false,Text="チェック7",Value="6"}, newOption{IsChecked=false,Text="チェック8",Value="7"}, newOption{IsChecked=false,Text="チェック9",Value="8"}, newOption{IsChecked=false,Text="チェック10",Value="9"} }; /// <summary> /// 初期表示時の処理 /// </summary> publicForm1() { InitializeComponent(); AddCheckboxHorizontally(); } /// <summary> /// チェックボックスを横方向に配置していく /// </summary> privatevoidAddCheckboxHorizontally() { foreach(Optionoinoptions) { CheckBox cb=createCheckBox(o); // 特に指定しなければ横に追加していく tableLayoutPanel1.Controls.Add(cb); } } /// <summary> /// チェックボックスを縦方向に配置していく /// </summary> privatevoidAddCheckboxVertically(){ intcol=0; introw=0; intmaxRow=4; for(intidx=0;idx<options.Count;idx++) { CheckBox cb=createCheckBox(options[idx]); if(row==maxRow) { row=0; col++; } // 特に指定しなければ横に追加していく tableLayoutPanel1.Controls.Add(cb,col,row++); } } /// <summary> /// チェックボックスを作成. /// </summary> /// <param name="o"></param> /// <returns></returns> privateCheckBox createCheckBox(Optiono) { CheckBox cb=newCheckBox(); cb.Checked=o.IsChecked; cb.Text=o.Text; cb.Name="chk_"+o.Value; cb.CheckedChanged+=newEventHandler(CheckBoxCheckedChangeHandler); returncb; } /// <summary> /// チェックボックス状態変更ハンドラー. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidCheckBoxCheckedChangeHandler(objectsender,EventArgse) { CheckBox cb=(CheckBox)sender; intindex=int.Parse(cb.Name.Replace("chk_","")); options[index].IsChecked=cb.Checked; } /// <summary> /// チェックボックスを削除する /// </summary> privatevoidRemoveCheckBox() { for(intidx=tableLayoutPanel1.Controls.Count-1;idx>=0;idx--) { Controlc=tableLayoutPanel1.Controls[idx]; tableLayoutPanel1.Controls.Remove(c); } } /// <summary> /// 切替ボタンクリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbutton1_Click(objectsender,EventArgse) { RemoveCheckBox(); if(toggleFlg==0) { AddCheckboxVertically(); toggleFlg=1; }else { AddCheckboxHorizontally(); toggleFlg=0; } } /// <summary> /// 登録ボタンクリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbutton2_Click(objectsender,EventArgse) { StringBuilder sb=newStringBuilder(); intcount=0; foreach(Optionoinoptions) { if(o.IsChecked) { sb.Append(Environment.NewLine).Append(o.Text); count++; } } sb.Insert(0,"チェックされたのは次の"+count+"件です。"); if(count>0) { MessageBox.Show(this,sb.ToString(),"チェック"); } else { MessageBox.Show(this,"チェックされていません。","チェック"); } } } } |
起動してみる
縦、横に順番で並べることができました。
まとめ
動的に配置できれば、
選択肢に増減がある場合などに使えますね。
もっと上手い方法もあるかと思いますが、
今回はサクッと、選択肢のリストをグローバルで保持し、
チェックボックスのIDを利用してどこのチェックボックスがチェックされているかを判定しました。
ソース(プロジェクト)は、
初めて GitHub にアップしてみましたが、上げ方合ってるのかな。。
何かの参考になれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません