首页 > 解决方案 > 动态生成复选框,但事件处理程序仅适用于最后一个

问题描述

我试图用事件处理程序动态地制作复选框,但事件处理程序只适用于最后一个生成的..

我试图改变我的代码的位置。我还尝试制作更多的复选框来确定这是否会有所作为。

for (int i = 0; i < appointments.TotalCount; i++) {
    lstChckBox = new List<CheckBox>();
    box = new CheckBox();
    box.Tag = i;
    box.Text = appointments.Items[i].Subject;
    box.AutoSize = true;
    box.Location = new Point(KalenderLbl.Location.X, KalenderLbl.Location.Y + 
    KalenderLbl.Height + 5 + (i * 25));

    lstChckBox.Add(box);

    box.CheckedChanged += new EventHandler(chck_CheckedChanged);

    Controls.Add(box);
  }
}


void chck_CheckedChanged(object sender, EventArgs e) {
  foreach(CheckBox item in lstChckBox) {
    if (item.Checked == true) {
      Hide();
    }
  }
}

我想知道如何更改代码,以便每个复选框都有这个事件处理程序..

标签: c#winformscheckboxdynamically-generated

解决方案


这段代码应该按照 Dmitry Bychenko 的建议来解决问题。

var lstChckBox = new List<CheckBox>( );
for (int i = 0; i < appointments.TotalCount; i++)
{
    box = new CheckBox( );
    box.Tag = i;
    box.Text = appointments.Items[i].Subject;
    box.AutoSize = true;

    box.Location = new Point( KalenderLbl.Location.X, KalenderLbl.Location.Y + KalenderLbl.Height + 5 + ( i * 25 ) );
    lstChckBox.Add( box );

    box.CheckedChanged += new EventHandler( chck_CheckedChanged );

    Controls.Add( box );
}

void chck_CheckedChanged( object sender, EventArgs e )
{
    foreach (CheckBox item in lstChckBox)
    {
        if (item.Checked == true)
        {
            Hide( );
        }
    }
}

我还建议缩短和简化部分代码,例如。

var lstChckBox = new List<CheckBox>( );
var InitialYPosition = KalenderLbl.Location.Y + KalenderLbl.Height + 5;
for (int i = 0; i < appointments.TotalCount; i++)
{
    box = new CheckBox( ) {
        Tag = i,
        Text = appointments.Items[i].Subject,
        AutoSize = true,
        Location = new Point( KalenderLbl.Location.X, InitialYPosition + ( i * 25 ) )
    };
    lstChckBox.Add( box );

    box.CheckedChanged += new EventHandler( chck_CheckedChanged );

    Controls.Add( box );
}

尽量减少代码并避免使用 box.Property 来设置一些将要设置的数据。


推荐阅读