为什么在ASP.NET中取消勾选复选框时不会触发CheckChanged事件?

5

这是一个考勤跟踪应用程序的一部分,它显示用户的科目并允许他标记自己的出勤情况。

当enableviewstate="true"时,复选框不会被取消选中,checkchanged事件也不会执行。

namespace portal

{

    public partial class tracker : System.Web.UI.Page
    {

        String[] split; string day;
        protected void Page_Load(object sender, EventArgs e)
        {

            /* if (Session["uname"] == null)
             {
                 Response.Redirect("Firstpage.aspx");
             }*/
            String[] split = new String[16];
            DateTime d1 = DateTime.Today;
            string month = d1.ToString("MMMM");
            Lblmonth.Text = month;
            String userid = Session["uname"].ToString();
            SqlConnection con2 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
            SqlCommand cmd2 = new SqlCommand("select sbranch ,syear from studdetails where userid=@userid ", con2);
            cmd2.Parameters.AddWithValue("userid", userid);
            String branch = "", year = "";
            SqlDataReader rdr2 = null;
            con2.Open();
            rdr2 = cmd2.ExecuteReader();
            while (rdr2.Read())
            {
                branch = rdr2["sbranch"].ToString();
                year = rdr2["syear"].ToString();
            }
            con2.Close();
            int sem = 0;
            switch (year)
            {
                case "B.E": sem = 8;
                    break;
                case "T.E": sem = 6;
                    break;
                case "S.E": sem = 4;
                    break;
                case "F.E": sem = 2;
                    break;
                default: sem = 2;
                    break;

            }

            int tempmonth = (int)(d1.Month);
            if (tempmonth > 6)
                sem = sem - 1;



            SqlConnection con3 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
            SqlCommand cmd3 = new SqlCommand("select subject from subjecttable where department=@dept and semester=@sem ", con3);
            cmd3.Parameters.AddWithValue("dept", branch);
            cmd3.Parameters.AddWithValue("sem", sem);
            con3.Open();
            SqlDataReader rdr3 = null;
            rdr3 = cmd3.ExecuteReader();
            string subject = "";
            while (rdr3.Read())
            {
                subject = rdr3["subject"].ToString();

            }
            con3.Close();
            Char[] separator = new Char[] { ',' };
            String[] subsplit = subject.Split(separator);
            int size = subsplit.Length;
            switch (size)
            {
                case 6: subj6.Text = subsplit[5];
                    goto case 5;
                case 5: subj5.Text = subsplit[4];
                    goto case 4;
                case 4: subj4.Text = subsplit[3];
                    goto case 3;
                case 3: subj3.Text = subsplit[2];
                    goto case 2;
                case 2: subj2.Text = subsplit[1];
                    goto case 1;
                case 1: subj1.Text = subsplit[0];
                    break; ;

            }

        }
        protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            if (e.Day.IsWeekend)
            {
                e.Cell.BackColor = System.Drawing.Color.DarkBlue;
            }
            else
            {
                e.Cell.BackColor = System.Drawing.Color.LightBlue;
            }
            SelectedDatesCollection dates = Calendar1.SelectedDates;

            DateTime toDay = DateTime.Today;
            string days = toDay.ToLongDateString();

            Labelday.Text = days;
            Char[] separator = new Char[] { ',' };
            String[] split1 = days.Split(separator);
            day = split1[0];
            Session["day"] = Calendar1.SelectedDate.ToShortDateString();
            if (dates.Count > 0)
            {
                Labelday.Text = dates[0].ToLongDateString() + "<br />";
                String temp = Labelday.Text;
                split1 = temp.Split(separator);
                day = split1[0];
            }
            if (!(day.Equals("Saturday") || day.Equals("Sunday")))
            {
                SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                string cla = Convert.ToString(Session["uclass"]);
                SqlCommand cmd = new SqlCommand("select " + day + " from studtimetable where class = @class ", con);

                con.Open();
                cmd.Parameters.AddWithValue("class", cla);
                SqlDataReader rdr = null;
                String tt = "";
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    tt = rdr[day].ToString();
                }
                con.Close();

                split = tt.Split(separator);
                int size = split.Length;
                lbltime.Visible = true;
                Lblsubj.Visible = true;
                Lblatt.Visible = true;
                switch (size)
                {
                    case 16: Label15.Text = split[15];
                        Session["l15"] = Label15.Text;
                        Label14.Text = split[14];
                        CheckBox8.Visible = true;

                        goto case 14;
                    case 14: Label13.Text = split[13];
                        Session["l13"] = Label13.Text;
                        Label12.Text = split[12];
                        CheckBox7.Visible = true;
                        goto case 12;
                    case 12: Label11.Text = split[11];
                        Session["l11"] = Label11.Text;
                        Label10.Text = split[10];
                        CheckBox6.Visible = true;
                        goto case 10;
                    case 10: Label9.Text = split[9];
                        Session["l9"] = Label9.Text;
                        Label8.Text = split[8];
                        CheckBox5.Visible = true;
                        goto case 8;
                    case 8: Label7.Text = split[7];
                        Session["l7"] = Label7.Text;
                        Label6.Text = split[6];
                        CheckBox4.Visible = true;
                        goto case 6;
                    case 6: Label5.Text = split[5];
                        Session["l5"] = Label5.Text;
                        Label4.Text = split[4];
                        CheckBox3.Visible = true;
                        goto case 4;
                    case 4: Label3.Text = split[3];
                        Session["l3"] = Label3.Text;
                        Label2.Text = split[2];
                        CheckBox2.Visible = true;
                        goto case 2;
                    case 2: Label1.Text = split[1];
                        Session["l1"] = Label1.Text;
                        Label0.Text = split[0];
                        CheckBox1.Visible = true;
                        break;

                }

            }
            else
            {
                lbltime.Text = "Enjoy weekend";
                lbltime.Visible = true;
            }
        }
        protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {

            CheckBox1.Checked = false;

            CheckBox2.Checked = false;

            CheckBox3.Checked = false;

            CheckBox4.Checked = false;

            CheckBox5.Checked = false;

            CheckBox6.Checked = false;

            CheckBox7.Checked = false;

            CheckBox8.Checked = false;
        }



        protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox1.Checked == true)
            {
                string sub = Session["l1"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();


            }
            else
            {
                Label18.Text = "uncheck";//temporary to check if this block executes
            }
        }



        protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
        {

            if (CheckBox2.Checked == true)
            {
                string sub = Session["l3"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {
            }

        }

        protected void CheckBox3_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox3.Checked == true)
            {
                string sub = Session["l5"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {
            }

        }

        protected void CheckBox4_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox4.Checked == true)
            {
                string sub = Session["l7"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {

            }

        }

        protected void CheckBox5_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox5.Checked == true)
            {
                string sub = Session["l9"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {
            }
        }

        protected void CheckBox6_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox6.Checked == true)
            {
                string sub = Session["l11"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {
            }
        }

        protected void CheckBox7_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox7.Checked == true)
            {
                string sub = Session["l13"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {
            }

        }

        protected void CheckBox8_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox8.Checked == true)
            {
                string sub = Session["l15"].ToString();
                string userid = Session["uname"].ToString();
                string date = Session["day"].ToString();
                string tempclass = Session["uclass"].ToString();

                SqlConnection con4 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=F:\mmm\portal\App_Data\student.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd4 = new SqlCommand("insert into " + tempclass + "track values ('" + userid + "','" + sub + "','" + date + "')", con4);
                con4.Open();

                cmd4.ExecuteNonQuery();
                con4.Close();

                //Response.Redirect("tracker.aspx");
            }
            else
            {
            }
        }
    }
}

也许你应该检查复选框的“状态”而不是其他属性。 - MethodMan
你如何获取 Visible="False" 的用户操作? - Candide
忽略 Candide . visible = false。从 8 个复选框中,我在页面加载事件中根据用户将 visible = true。 - Mohit Jain
乍一看,似乎你只在Calendar1_SelectionChanged方法中更改了选中状态 - 仅出于测试目的,为什么不将该方法的主体注释掉,看看是否仍然遇到相同的错误。 - 99823
谢谢Loren查看代码。我尝试添加注释,但没有帮助。当用户取消选中复选框1时,为什么CheckChanged事件的else部分没有被执行是我关心的问题。 - Mohit Jain
4个回答

5

当我设置 enable viewstate = true 时,它不允许我取消复选框。取消选择后,页面重新加载并且复选框仍然被选中。 - Mohit Jain
你可能在ASP.NET页面生命周期中有其他设置复选框的操作,或者在事件处理程序中修改数据后没有重新加载存储的数据。 - Floremin
谢谢,floremin。但我正在重新加载数据...我猜是由于enableViewState = true,复选框保留了先前的状态.. - Mohit Jain
这里有一些解决方案,但是我不理解,请问有人可以详细说明一下吗?https://dev59.com/3HM_5IYBdhLWcg3wXx_Z?rq=1 - Mohit Jain
然后在你的 CheckBox1_CheckedChanged 处理程序中处理完 INSERT 或 DELETE 后,你可以设置 CheckBox1.Checked = false - Floremin
请仔细查看整个代码,并告诉我是哪个语句不允许复选框取消选中。同时,在调试器模式下,当取消选择时,checkchanged根本没有执行。 - Mohit Jain

4

移除 EnableViewState="false",就可以正常工作了。


1
移除EnableViewState="false"并没有起到作用...因为当我勾选复选框时,它会被勾选并且正常执行...但是它不允许我取消勾选复选框。当我尝试取消勾选时,页面会重新加载,并且复选框仍然保持勾选状态。 - Mohit Jain
你是从数据库中获取数据来勾选这个框吗?听起来像是你的代码后台文件中有一些重新勾选该框的操作。 - 99823
我开始了一个空项目,测试了它并且每次都能完美运行,因此我认为你没有展示所有影响复选框选中状态的代码。 - 99823
谢谢Loren。考虑到你的回答,我执行了一个新项目,真的很有效...你能否请查看我的整个代码,并回答哪里有缺陷导致复选框保持选中状态... P.S:这段代码是考勤跟踪应用程序的一部分,它根据用户显示时间表,并让他标记自己的出勤情况。 - Mohit Jain
请仔细查看整个代码,并告诉我哪个语句不允许复选框取消选择。此外,在调试器模式下,当取消选择时,checkchanged根本没有执行。 - Mohit Jain

2
感谢大家的关注。 问题终于解决了。当用户取消选中时,checkchanged方法没有执行,原因是:1)启用autopostback后,取消选中会导致page_load方法执行,进而导致checkbox.visible = false,所以checkchanged没有执行;2)然后日历渲染方法会根据之前的状态(viewstate=true),将checkbox.visible设置为true,即选中状态。 特别感谢floremin和loren。

我遇到了同样的问题。在我的情况下,复选框默认为禁用状态(Enabled="false")。因此,视图状态未加载到控件中。 - algreat

1
解决方案:您应该设置-> EnableViewstate = True,ViewStateMode = Enabled,Autopostback = true。就这样。这对我有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接