|
■No25547 (C#初心者 さん) に返信
このような感じでいかがでしょうか?
テストなので少々半端ではありますが…。
※環境:VS2005 C# WindowsForm
※テスト環境からのコピペです
--- UseControl側のコード ---
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public bool UserChceked
{
get { return chk.Checked; }
set { chk.Checked = value; }
}
}
----------------------------
--- フォーム側のコード ---
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int pointX = 1;
private void button1_Click(object sender, EventArgs e)
{
// やじゅさんが既にご指摘されていますが、
// this.ControlではPanel内のコントロールは見ません。
// 飽くまでForm内のコントロールのみです。
if (this.panel1.Controls.Count < 5)
{
UserControl1 uCtrl = new UserControl1();
uCtrl.Name = String.Format("chkButton{0}", this.panel1.Controls.Count + 1);
uCtrl.Location = new Point(0, pointX * 50);
this.panel1.Controls.Add(uCtrl);
pointX++;
}
}
private void btnCountChecked_Click(object sender, EventArgs e)
{
StringBuilder placeNumber = new StringBuilder();
for (int i = 0; i < this.panel1.Controls.Count; i++)
{
if (this.panel1.Controls[i].GetType() == typeof(UserControl1))
{
UserControl1 target = (UserControl1)this.panel1.Controls[i];
if(!target.UserChceked) continue;
placeNumber.Append(target.Name.Substring(9) +
(i < this.panel1.Controls.Count ? ", " : ""));
}
}
MessageBox.Show(String.Format("{0}番目のチェックがオン",placeNumber.ToString()));
}
}
---------------------------
ユーザーコントロールはその都度別なインスタンスとし、
それぞれに番号の入った名前をつけます。
名前内の番号 = 何番目にあたる ということです。
今回は手っ取り早く(?)一桁台のみにしました。
また、複数チェックされていた場合にも対応していますが、
追加が二桁以上の場合は別途確認処理が必要です。
|