关于RadioButton的一些疑问

Acyk 2016-03-06 01:54:27
在Asp.NET开发的时候,一个页面,4个选项,分别使用RadioButton做单选题,原设计是当点击RadioButton之后,触发Click事件,后发现asp下没有这个事件,只有CheckedChanged,于是将代码填入:
if (RadioButton1.Checked == true) answer[id] = "A";
if (RadioButton2.Checked == true) answer[id] = "B";
if (RadioButton3.Checked == true) answer[id] = "C";
if (RadioButton4.Checked == true) answer[id] = "D";

后来发现仍然不能把答案传入后台,前台开启了AutoPostBack="true",页面点击触发,可以选择了,新的问题出现了,答案不能修改,选A就是A了,再选B,刷新页面,答案还是A,没有传入后台,于是乎设计了一个timer事件,每秒都要
if (RadioButton1.Checked == true) answer[id] = "A";
if (RadioButton2.Checked == true) answer[id] = "B";
if (RadioButton3.Checked == true) answer[id] = "C";
if (RadioButton4.Checked == true) answer[id] = "D";

但结果还是一样的,请问各位大神,怎么才能实现修改后,答案可以传入后台,计入answer组之中?
(answer使用的是一个Session,用于在各页面中传递答案)
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acyk 2016-03-12
  • 打赏
  • 举报
回复
已经成功解决,取消了timer,在page_load里添加了

        RadioButton1.CheckedChanged += new EventHandler(RadioButton1_CheckedChanged);
        RadioButton2.CheckedChanged += new EventHandler(RadioButton2_CheckedChanged);
        RadioButton3.CheckedChanged += new EventHandler(RadioButton3_CheckedChanged);
        RadioButton4.CheckedChanged += new EventHandler(RadioButton4_CheckedChanged);
在RadioButton_CheckedChanged里修改为

    protected void RadioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (RadioButton1.Checked == true)
        {
            string[] answer = Session["answer"] as string[];
            answer[id] = "A";
            Session["answer"] = answer;
        }
    }
就解决答案修改的问题了。 之前没有EventHandler,导致了RadioButton_CheckedChanged没有执行。
Acyk 2016-03-12
  • 打赏
  • 举报
回复
设置button之后,点击并没有恢复默认,而是按我预期依然读取到已选的那项,但就是不能改变,想改变重新打开这一页又回到之前选的那一项。而且timer不能停止,停止的话刷新就什么都没有了。本帖的重点在于为什么不能修改,而不是说恢复成默认。程序可以正常运行,就是不能修改答案,重点在于为什么不能修改。
  • 打赏
  • 举报
回复
需要把Load与CheckedChanged事件分开 private void RadioButton1_CheckedChanged(object sender, EventArgs e) { } 第一把先了解这两个事件。 然后再了解
引用 3 楼 sp1234 的回复:
你们看真的能“对付”啊。不过对付2、3次,就彻底搞垮了。 假设普通的asp.net 页面回发之后发现状态就是了、数据恢复成默认值了,那么你就要检查一下 Page_Load 里边有没有写上
if(!Postback)
{
.......
}
这样的判断。 你可以看到,真正的 asp.net 页面在回发时(例如点击RadioButton 造成回发时)是不会去花时间去重复读取数据库的,也就是说不会去重新人工 bind 控件内容的。只要是以为页面回发就得重新绑定页面上的控件的,都是没有搞懂asp.net 最基本的机制的。 我通常会强调一个最基本的测试,来判断传统的 asp.net 程序应用程序,一个程序员到底适不适合继续开发它。具体做法是:用鼠标拖拉一个 Button按钮到页面,然后双击它产生后台捕获事件处理方法(维持方法内空的——什么都不做——就可以了)。这就完了!当你开发时,例如你在页面上放了Radio 选择或者别的控件,那么先不要急着放更多的控件、实现更多的UI需求,先按 F5 运行页面,然后操作一下页面(改变用户选择),然后点这个 Button,让页面回发。由于这个 Button 其实在后台什么都不做,那么当你的页面刷新之后,你应该看到页面上用户选择的状态还在、没有出现任何混乱。如果混乱了,例如数据变成初始值了,那么别往下编程了,赶紧解决这个问题吧。因为这是asp.net 页面最最基本最初级但是也是决定了将来的编程会不会“坑”的重要知识点,页面回发时并不需要重新绑定后台数据数据,必须提前、随时用这个 button 来测试。一个页面必须上万次地、数十万次地经过这个button测试。
就差不多了
Acyk 2016-03-12
  • 打赏
  • 举报
回复
http://test.icesoft.cc public partial class Default2 : System.Web.UI.Page { string number = ""; int id = 0, tid = 0; int up, down; protected void Page_Load(object sender, EventArgs e) { Timer t= new Timer(); t.Interval = 1000; t.Elapsed += new ElapsedEventHandler(MTimedEvent); t.Start(); System.DateTime currentTime = new System.DateTime(); currentTime = System.DateTime.Now; string strTime = currentTime.ToString("t"); user_label.Text = Session["user"].ToString(); user_id_label.Text = Session["user_id"].ToString(); time_label.Text = strTime.ToString(); date_label.Text = Session["strYMD"].ToString(); string[] question = Session["question"] as string[]; string[] answer = Session["answer"] as string[]; string[] right_answer = Session["right_answer"] as string[]; string[] ref1 = Session["ref1"] as string[]; // System.Timers.Timer t = new System.Timers.Timer(1000); // time_label.Text = strTime.ToString(); try //获取当前题目编号 { number = Request.QueryString["q"].ToString(); id = int.Parse(number); } catch (Exception) { } //界面修饰相关 up = id - 1; if (up < 0) up = 0; down = id + 1; if (down >= 140) down = 139; Label1.Text="<a href=\"exam.aspx?q="+down+"\">下一题</a>"; Label2.Text = "<a href=\"exam.aspx?q=" + up + "\">上一题</a>"; //显示指定题目及选项 OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.HtmlEncode(Request.PhysicalApplicationPath) + "database.mdb"); OleDbCommand aCommand = new OleDbCommand("SELECT * FROM [questions]", aConnection); try { aConnection.Open(); //创建datareader 对象来连接到表单 OleDbDataReader aReader = aCommand.ExecuteReader(); //Console.WriteLine("This is the returned data from emp_test table"); //循环遍历数据库 while(aReader.Read()) { id_label.Text = aReader["ID"].ToString(); tid=id+1; q_label.Text = tid.ToString(); if (id_label.Text == question[id]) { summary_label.Text = aReader["Title"].ToString(); A_label.Text = aReader["A"].ToString(); B_label.Text = aReader["B"].ToString(); C_label.Text = aReader["C"].ToString(); D_label.Text = aReader["D"].ToString(); Chapter_label.Text = aReader["Chapter"].ToString(); answer_label.Text = aReader["Answer"].ToString(); right_answer[id] = answer_label.Text; ref1[id] = aReader["Ref"].ToString(); Session["right_answer"] = right_answer; Session["ref1"] = ref1; break; } } if (answer[id] == "A") RadioButton1.Checked = true; if (answer[id] == "B") RadioButton2.Checked = true; if (answer[id] == "C") RadioButton3.Checked = true; if (answer[id] == "D") RadioButton4.Checked = true; //关闭reader对象 aReader.Close(); //关闭连接,这很重要 aConnection.Close(); } catch (OleDbException) { } } void MTimedEvent(object source, System.Timers.ElapsedEventArgs e) { //开始工作 StartWork(); } void StartWork() { try { string[] answer = Session["answer"] as string[]; if (RadioButton1.Checked == true) answer[id] = "A"; if (RadioButton2.Checked == true) answer[id] = "B"; if (RadioButton3.Checked == true) answer[id] = "C"; if (RadioButton4.Checked == true) answer[id] = "D"; Session["answer"] = answer; } catch (Exception) { } } }
正怒月神 版主 2016-03-08
  • 打赏
  • 举报
回复
请上代码,这问题,我真没遇到过。
Acyk 2016-03-08
  • 打赏
  • 举报
回复
拖了button测试了一下,还是一样,第一次选择就没问题,但回过头想修改答案,却改不了,或者改好几次突然有一次可以改成功了。
sp1234_maJia 2016-03-06
  • 打赏
  • 举报
回复
比如说,页面上有一个 GridView 控件,终端用户点击其中一行的按钮、进入编辑状态,然后用户在这一行中某一列刚刚输入“123abc”,这个时候立刻点击上面的“button 测试”按钮,会是什么情况? 正常的 asp.net 程序,你会看到页面回发之后,这个 GridView的那一行还是编辑状态,而且用户录入的“123abc”还在,输入焦点还是这个文本框。这就是正常的 asp.net 程序。 而那些每当回发页面时都去重新绑定后台数据的 asp.net 应用呢?肯定就乱了嘛。且不说它一遍遍读取数据库绑定控件有多么慢,最起码是把用户操作丢失了嘛。 用户对一个页面操作时,往往都是这样的,在一个地方录入一点(例如改变radio 的选择),然后另一个地方再录入一点(例如提交一个“考试编号”,再回到前一个地方继续修改内容。这在回发时会去重新绑定第二部分的控件,但是不会在页面回发时胡乱去重新绑定第一部分的控件。 所以,我们用一个“什么都不干页面回发button控件”,能提前探测出那些asp.net 程序的预先给你埋下的地雷。
  • 打赏
  • 举报
回复
虽然这是一个非常简单的道理,但是你看一些人写的博客,你注意一下 Page_Load 里边是怎么写的,就明白有多少人是在为了写博客而写博客了。 而我强调的是,你写代码一定是为了实用,在大产品中实用,不是为了暂时地在一些初学 asp.net 的读者面前混过去。所以我想告诉初学者怎样判断一个 asp.net 代码更接近合格 asp.net 代码的测试关键,让你在学习时就避免被人忽悠。
  • 打赏
  • 举报
回复
假设普通的asp.net 页面回发之后发现状态就是了 --> 假设普通的asp.net 页面回发之后发现状态丢失了 不管你学习时是个什么方式学的,等你真的做东西时,就没有人管你了,这时候才真的显现出趋势。如果这个时候你“摊上大事儿了”还是没有理解 asp.net 的原理,那么你将来不但无法拿 asp.net 更自由地玩儿,而且还会非常痛苦。
  • 打赏
  • 举报
回复
你们看真的能“对付”啊。不过对付2、3次,就彻底搞垮了。 假设普通的asp.net 页面回发之后发现状态就是了、数据恢复成默认值了,那么你就要检查一下 Page_Load 里边有没有写上
if(!Postback)
{
.......
}
这样的判断。 你可以看到,真正的 asp.net 页面在回发时(例如点击RadioButton 造成回发时)是不会去花时间去重复读取数据库的,也就是说不会去重新人工 bind 控件内容的。只要是以为页面回发就得重新绑定页面上的控件的,都是没有搞懂asp.net 最基本的机制的。 我通常会强调一个最基本的测试,来判断传统的 asp.net 程序应用程序,一个程序员到底适不适合继续开发它。具体做法是:用鼠标拖拉一个 Button按钮到页面,然后双击它产生后台捕获事件处理方法(维持方法内空的——什么都不做——就可以了)。这就完了!当你开发时,例如你在页面上放了Radio 选择或者别的控件,那么先不要急着放更多的控件、实现更多的UI需求,先按 F5 运行页面,然后操作一下页面(改变用户选择),然后点这个 Button,让页面回发。由于这个 Button 其实在后台什么都不做,那么当你的页面刷新之后,你应该看到页面上用户选择的状态还在、没有出现任何混乱。如果混乱了,例如数据变成初始值了,那么别往下编程了,赶紧解决这个问题吧。因为这是asp.net 页面最最基本最初级但是也是决定了将来的编程会不会“坑”的重要知识点,页面回发时并不需要重新绑定后台数据数据,必须提前、随时用这个 button 来测试。一个页面必须上万次地、数十万次地经过这个button测试。
dalmeeme 2016-03-06
  • 打赏
  • 举报
回复
改用RadioButtonList实现较好。 如果用RadioButton,需要为同一组单选按钮设置相同的GroupName属性。
insus 2016-03-06
  • 打赏
  • 举报
回复

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧