0

我正在动态生成复选框,所有这些都写在 page_load

我的要求是:

如果我选中复选框,我想计算选中的复选框数量,并且单选按钮将出现相对选中的复选框。

CheckBox cb = (CheckBox)Page.FindControl("chk" + j);

即使我选中了 cd 显示的复选框 check = false

下面是代码:

    string strfromdt = Session["leavefrm"].ToString();
    DateTime startDate = Convert.ToDateTime(strfromdt);
    string strtodt = Session["leaveto"].ToString();
    DateTime endDate = Convert.ToDateTime(strtodt);

    string strdays = Session["noofdays"].ToString();
    float daysf = float.Parse(strdays);
    float days = (float)Math.Ceiling(daysf);
    CheckBox chk;
    Label lbl;
    RadioButton rd;

    days++;

            OleDbCommand cmd;
            DbConnection.Open();
            cmd = new OleDbCommand("select HOL_DATE from IND_HOLIDAYS", DbConnection);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);


            for (int j = 1; j <= days - 1; j++)
            {
                while(startDate <= endDate)
                {
                    for (int i = 0; i <= dt.Rows.Count - 1; i++)
                    {
                        string strdate = dt.Rows[i]["HOL_DATE"].ToString();
                        DateTime date = Convert.ToDateTime(strdate);

                        if (startDate == date)

                            startDate = startDate.AddDays(1);
                    }

                    if ((startDate.DayOfWeek == DayOfWeek.Saturday) || ((startDate.DayOfWeek == DayOfWeek.Sunday)))
                    {
                        startDate = startDate.AddDays(1);
                        continue;
                    }
                    break;
                }


                chk = new CheckBox();
                chk.ID = j.ToString();
                chk.AutoPostBack = true;
                // chk.Checked = true;
                lbl = new Label();
                lbl.Text = startDate.ToString("dd/MM/yyyy");
                lbl.ID = j.ToString();
                PlaceHolder1.Controls.Add(lbl);
                PlaceHolder1.Controls.Add(chk);

                PlaceHolder1.Controls.Add(new RadioButton { });

                PlaceHolder1.Controls.Add(new LiteralControl("<BR>"));

                startDate = startDate.AddDays(1);



                CheckBox cb = (CheckBox)Page.FindControl("chk" + j);

               //chk.Checked = CheckBox1Checked;
               //chk.oncheckedchanged += CheckBox1OnChecked;

                int chkcount = 0;
                if (chk.Checked)
                {
                    chkcount++;
                }
                int chkcount1 = chkcount;
            }
4

1 回答 1

0

您正在搜索一个不存在的 ID。

首先,您将控件的 ID 设置为一个数字 (j),然后您将尝试通过搜索“chk”+数字 j 来找到它。

这里有2个选项:

更改chk.ID = j.ToString();chk.ID ="chk" + j.ToString();

或者

更改CheckBox cb = (CheckBox)Page.FindControl("chk" + j);CheckBox cb = (CheckBox)Page.FindControl(j);

就我个人而言,我会选择第一个选项,因为仅用数字命名控件并不是一个好主意。

更新

for (int j = 1; j <= days - 1; j++)
{
    ...

    chk = new CheckBox();
    chk.ID = j.ToString();
    chk.AutoPostBack = true;
    // chk.Checked = true;

    lbl = new Label();
    lbl.Text = startDate.ToString("dd/MM/yyyy");
    lbl.ID = j.ToString();
    PlaceHolder1.Controls.Add(lbl);
    PlaceHolder1.Controls.Add(chk);
    PlaceHolder1.Controls.Add(new RadioButton { });
    PlaceHolder1.Controls.Add(new LiteralControl("<BR>"));

    startDate = startDate.AddDays(1);

    //No need fot this. You still have the object chk from a few lines above
    // CheckBox cb = (CheckBox)Page.FindControl("chk" + j);

    //If you want to use this, put these lines before you add the control.
    //chk.Checked = CheckBox1Checked;
    //chk.oncheckedchanged += CheckBox1OnChecked;

    //You should declare this outside the for-loop or even outside the method 
    //if you want to use it elsewhere
    int chkcount = 0;

    //Here you are using the correct object.
    //chk.Checked should reflect exactly what you've set above.
     if (chk.Checked)
    {
        chkcount++;
    }
    int chkcount1 = chkcount;
}
于 2013-09-24T09:09:06.473 回答