首页 > 解决方案 > ASP.NET| 复选框的“checked=true”未设置在右侧复选框中

问题描述

我正在为我正在构建的网站开发一个简单的多阶段注册页面,我让用户可以使用复选框选择他知道的程序/编程语言:

但是当我点击“下一步”按钮时,为了进入下一阶段,我选中的复选框没有设置为 true,而是复选框没有。18设置为true(虽然我没有检查它)

我确信这与这个阶段之前的阶段有关,我正在构建动态的单选按钮,用户可以在其中选择他的职业(例如艺术家、歌手等)。有 17 个单选按钮,它们以某种方式干扰了下一阶段,其中复选框的选中值仅从复选框编号开始。18 正如我之前提到的。

这是一些代码:

 else if (int.Parse(ViewState["DivID"].ToString()) == 2)
            {
                // save the Birthday Date, Language and country of the user.
                ViewState["year"] = int.Parse(DropDownYear.SelectedValue);
                ViewState["month"] = int.Parse(DropDownMonth.SelectedValue);
                ViewState["day"] = int.Parse(DropDownDay.SelectedValue);
                ViewState["Language"] = int.Parse(langDropDown.SelectedValue);
                ViewState["Country"] = int.Parse(CountryDropDown.SelectedValue);
                // ---------------------------------------------
                // change from part 2 of the registration to part 3
                registrationP2.Visible = false;
                BindProfessions(radios, Page);
                registrationP3.Visible = true;
                radios.Visible = true;
            }
            else if (int.Parse(ViewState["DivID"].ToString()) == 3)
            {
                // change from part 3 of the registration to part 4
                ViewState["Profid"] = CheckRadio(radios);
                registrationP3.Visible = false;
                BindKnowledge(CheckboxCon, Page);
                registrationP4.Visible = true;
                CheckboxCon.Visible = true;
                // ---------------------------------------------
                //next.Visible = true;
            }
            else if(int.Parse(ViewState["DivID"].ToString()) == 4)
            {
                List<int> v = GetCheckBox(CheckboxCon);
                ViewState["Knowids"] = GetCheckBox(CheckboxCon);
            }

绑定方法:

public static void BindProfessions(HtmlControl ctrl, Page thispage)
    {
        List<Profession> Plist = Profession.GetProfessionList();
        foreach (Profession p in Plist)
        {
            HtmlInputRadioButton rd_button = new HtmlInputRadioButton();
            const string GROUP_NAME = "Professions";
            rd_button.Name = GROUP_NAME;
            string LinkID = "P" + p.ProfessionID.ToString();
            rd_button.Attributes["id"] = LinkID;
            RegisterUserControl userprofession = (RegisterUserControl)thispage.LoadControl("~/RegisterUserControl.ascx");
            userprofession.imgP = p.ProfPath;
            userprofession.fieldName = p.ProfName;
            userprofession.IDnum = p.ProfessionID;
            userprofession.RadioName = LinkID;
            userprofession.EnableViewState = false;
            rd_button.EnableViewState = false;
            ctrl.Controls.Add(rd_button);
            rd_button.Value = p.ProfessionID.ToString();
            ctrl.Controls.Add(userprofession);
        }
    }


    public static void BindKnowledge(HtmlControl ctrl, Page thispage)
    {
        List<Knowledge> Plist = Knowledge.RetKnowledgeList();
        foreach (Knowledge p in Plist)
        {
            HtmlInputCheckBox rd_button = new HtmlInputCheckBox();
            const string GROUP_NAME = "knowledge";
            rd_button.Name = GROUP_NAME;
            string LinkID = "Know" + p.ProgramID.ToString();
            rd_button.Attributes["id"] = LinkID;
            rd_button.Value = p.ProgramID.ToString();
            RegisterUserControl userprofession = (RegisterUserControl)thispage.LoadControl("~/RegisterUserControl.ascx");
            userprofession.imgP = p.ProgPath;
            userprofession.fieldName = p.PName;
            userprofession.IDnum = p.ProgramID;
            userprofession.RadioName = LinkID;
            userprofession.EnableViewState = false;
            rd_button.EnableViewState = false;
            ctrl.Controls.Add(rd_button);
            ctrl.Controls.Add(userprofession);
        }
    }

检查收音机和复选框的方法:

public static int CheckRadio(HtmlControl ctrl)
    {
        try
        {
            int counter = 0;
            int id = -1;
            foreach (Control rdButton in ctrl.Controls)
            {
                if (rdButton is HtmlInputRadioButton)
                {
                    HtmlInputRadioButton bu = (HtmlInputRadioButton)rdButton;
                    if (bu.Checked)
                    {
                        counter++;
                        id = int.Parse(bu.Value);
                        
                    }
                }
            }
            if (counter > 1)
            {
                return -1;
            }
            return id;
        }
        catch (Exception e)
        {
            return -1;
        }
    }

    public static List<int> GetCheckBox(HtmlControl ctrl)
    {
        List<int> id_list = new List<int>();
        foreach (Control rdButton in ctrl.Controls)
        {
            if (rdButton is HtmlInputCheckBox)
            {
                HtmlInputCheckBox bu = (HtmlInputCheckBox)rdButton;
                if (bu.Checked)
                {
                    id_list.Add(int.Parse(bu.Value));
                }
            }
        }
        return id_list;
    }
}

调试时可以看到,如果我选择前 3 个职业,返回给我的值List<int> v分别是 18、19 和 20 照片:debugging photo

我应该提到,在创建动态用户控件和复选框/单选按钮后,我将在受保护的 void Page_Load 中的回发时再次创建它们。

我被困了好几天,我不知道问题出在哪里,是因为 ViewState,还是我创建控件的方式......我真的不知道。

在此先感谢,伊丹。

编辑:我玩了一下,发现当我禁用我之前在 Page_load 中启动的职业绑定时,它确实可以正常工作,page load code请查看第二个 if 语句:

  protected void Page_Load(object sender, EventArgs e)
    {
        IsPageRefresh = false;
        if (!IsPostBack)
        {
            ViewState["DivID"] = 1;
            ViewState["postids"] = System.Guid.NewGuid().ToString();
            Session["postid"] = ViewState["postids"].ToString();
        }
        else
        {
            if (ViewState["postids"].ToString() != Session["postid"].ToString())
            {
                IsPageRefresh = true;
            }
            Session["postid"] = System.Guid.NewGuid().ToString();
            ViewState["postids"] = Session["postid"].ToString();
        }
        if (int.Parse(ViewState["DivID"].ToString()) == 3)
        {
            //BindProfessions(radios, Page);
        }
        else if(int.Parse(ViewState["DivID"].ToString()) == 4)
        {
            BindKnowledge(CheckboxCon, Page);
        }

    }

问题是我仍然需要在按下按钮后再次启动它才能获得选中的值,我该如何解决这个问题,为什么会这样?非常感谢您的帮助。出现问题是因为页面识别出我添加了 17 个新复选框,而当我检查它们时,前 17 个直到第 18 个(我检查的第一个)才被检查,最终没有检查正确复选框....

为了清楚起见,我将其他单选按钮添加到页面上的不同 div,我不知道这里发生了什么

标签: asp.netcheckbox

解决方案


对于任何有同样问题的人。

我最终在 Page_PreInit() 中创建了对象,它解决了问题,建议(根据我阅读的内容)在页面发生其他任何事情之前在 Page_PreInit 中创建动态对象。

 protected void Page_PreInit(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack && Session["DivID"] == null)
            {
                Session["DivID"] = 1;
            }
            if ((int)Session["DivID"] == 3)
            {

                InitBindProfessions(Page); 
            }
            else if ((int)Session["DivID"] == 4)
            {
                InitBindKnowledge(Page);
            }
        }
        catch
        {
            Response.Redirect("HomePage.aspx");
        }
    }

InitBindKnowledge 和 InitBindProfessions 就像 BindKnowledge 和 BindProfession 但没有将用户控件添加到控件树


推荐阅读