出错了。单选按钮做的一个选择题抽题小程序,高手请赐教。谢谢。

huoyan6878 2013-10-13 06:35:36
朋友们帮帮忙看下代码。我想做一个winform下,选择题抽题回答的小程序,下面是当单击按钮时,判断哪个单选按钮被选中了,然后对比答案,给出正确答案,并判断对错。前面都没有问题,唯独在没有单选按钮未选中时的代码出现问题。后面注释掉的就是单选按钮未选中的代码。但是加上那些代码后,就出错,只有第一个按钮可以判断对错,后面的可以获取是哪个按钮被选中,但是选中后三个按钮后,都不运行回答错误的那句代码,而直接运行注释掉的那个else语句。就好像是其他按钮被选中,都被认为是没选一样。
这里我应该怎么处理?
//注:chuandishuju.daan是我从数据库里提取出来的正确答案。单选按钮放到同一个groupBox1内。
foreach (Control val in groupBox1.Controls)
{
if (val is RadioButton && (val as RadioButton).Checked)
{
switch (val.Name)
{
case "radioButton1": rdChecked = "A"; break;
case "radioButton2": rdChecked = "B"; break;
case "radioButton3": rdChecked = "C"; break;
case "radioButton4": rdChecked = "D"; break;
default: rdChecked = ""; break;
}
if (chuandishuju.daan.ToUpper().Trim() == rdChecked)
{
textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答正确!";
}
else
{
textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答错误!";
}
}
//这里想判断如果什么都没选中,单击按钮,则显示“正确答案是:xx”,而不显示回答正确还是错误。
//下面这个else语句,不知道为什么,加上就出错,BCD三个选项不能很好判断,本来没问题的。把抽题前,查看答案按钮设为不可用就出问题了。
//可以很好的获取选择的是哪个单选按钮,但是就是不能很好运行,加上后,第一个单选按钮可以很好判断,后面那3个都可以知道是选中的哪个,
//但不能判断正确错误。而直接运行下面的else语句。
//else
//{
// textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim();
//}
//下面这个if语句也不让用,用就出错,怎么才能处理没有选择的情况呢?
//if (val is RadioButton && !(val as RadioButton).Checked)//解释见下面那一大堆。。。
//{
// textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim();
//}
}
...全文
398 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2013-10-14
  • 打赏
  • 举报
回复
引用 4 楼 huoyan6878 的回复:
[quote=引用 1 楼 caozhy 的回复:] 代码太罗嗦!
var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked);
textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + "     回答" + (rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') ? "正确!" : "错误!";
我用版主的代码,确实很简洁。我虽然也是计算机专业毕业的,但是毕业很多年了,而且当时仅仅算是学会c和c++的一些基础知识。现在凭c和c++的那点基础重新弄程序玩。有点郁闷。代码都看不懂。 版主的代码我就没看懂groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked)和rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A',这两句什么意思。而且我用的是vs2008,不知道是不是版本的原因,直接替换成版主的代码,运行时说无法将string隐式转换成bool型。我只好再次修改啰嗦点: var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked); if(rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') { textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答正确!" ; } else textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答错误!"; 这样运行成功了。[/quote] 少了一个括号,不好意思。和2008无关。 s = a + b ? c : d 必须写成 s = a + (b ? c : d)
huoyan6878 2013-10-14
  • 打赏
  • 举报
回复
谢谢版主再次看帖子并更正。虽然是小问题,但是版主不说,我还真找不出错误,只能靠上面我那种笨办法去做。
Falleyes 2013-10-14
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
[quote=引用 4 楼 huoyan6878 的回复:] [quote=引用 1 楼 caozhy 的回复:] 代码太罗嗦!
var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked);
textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + "     回答" + (rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') ? "正确!" : "错误!";
我用版主的代码,确实很简洁。我虽然也是计算机专业毕业的,但是毕业很多年了,而且当时仅仅算是学会c和c++的一些基础知识。现在凭c和c++的那点基础重新弄程序玩。有点郁闷。代码都看不懂。 版主的代码我就没看懂groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked)和rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A',这两句什么意思。而且我用的是vs2008,不知道是不是版本的原因,直接替换成版主的代码,运行时说无法将string隐式转换成bool型。我只好再次修改啰嗦点: var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked); if(rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') { textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答正确!" ; } else textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答错误!"; 这样运行成功了。[/quote] 少了一个括号,不好意思。和2008无关。 s = a + b ? c : d 必须写成 s = a + (b ? c : d)[/quote]版主的功夫果然了得,请问版主这些方法是看MSDN还是看别人的博客知道的?我现在了解的方法、属性都极少,结果好多问题只用逻辑解决,代码量过大。
huoyan6878 2013-10-13
  • 打赏
  • 举报
回复
引用 2 楼 guwei4037 的回复:
一用就出错,你就不能单步调试一下吗?所有问题不就解决了么?
很不好意思,我不会用单步调试。我毕业多年,学校就没学好,而且当时老师也没说过什么单步调试,这么多年没和程序打交道,现在心血来潮,想编小程序玩玩。贻笑大方是正常的。各位多体谅。
huoyan6878 2013-10-13
  • 打赏
  • 举报
回复
引用 3 楼 Falleyes 的回复:
你的逻辑好像有问题啊,总的foreach循环,你遍历每一个RadioButton,只要没有点击,就执行你加的else子句。比如你的前面已经选择了,最后一个没选择,那么textbox3就会被赋值没有选择的内容。 你可以在foreach之外赋值一个布尔变量all_false,为true,在foreach里面,只要见到Checked为true,就赋值all_false为false,循环完毕进行判断,如果all_false为true,就把textbox3赋值为未选择的内容。个人拙见!
谢谢,我只是在用foreach循环,具体这个循环什么情况我还真不了解。用你的方法解决问题了。同时也了解了foreach循环的原理。
huoyan6878 2013-10-13
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
代码太罗嗦!
var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked);
textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + "     回答" + (rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') ? "正确!" : "错误!";
我用版主的代码,确实很简洁。我虽然也是计算机专业毕业的,但是毕业很多年了,而且当时仅仅算是学会c和c++的一些基础知识。现在凭c和c++的那点基础重新弄程序玩。有点郁闷。代码都看不懂。 版主的代码我就没看懂groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked)和rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A',这两句什么意思。而且我用的是vs2008,不知道是不是版本的原因,直接替换成版主的代码,运行时说无法将string隐式转换成bool型。我只好再次修改啰嗦点: var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked); if(rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') { textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答正确!" ; } else textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答错误!"; 这样运行成功了。
Falleyes 2013-10-13
  • 打赏
  • 举报
回复
你的逻辑好像有问题啊,总的foreach循环,你遍历每一个RadioButton,只要没有点击,就执行你加的else子句。比如你的前面已经选择了,最后一个没选择,那么textbox3就会被赋值没有选择的内容。 你可以在foreach之外赋值一个布尔变量all_false,为true,在foreach里面,只要见到Checked为true,就赋值all_false为false,循环完毕进行判断,如果all_false为true,就把textbox3赋值为未选择的内容。个人拙见!
全栈极简 2013-10-13
  • 打赏
  • 举报
回复
一用就出错,你就不能单步调试一下吗?所有问题不就解决了么?
threenewbee 2013-10-13
  • 打赏
  • 举报
回复
代码太罗嗦!
var rb = groupBox1.Controls.OfType<RadioButton>().SingleOrDefault(x => x.Checked);
textBox3.Text = "正确答案是:" + chuandishuju.daan.Trim() + " 回答" + (rb != null && rb.Name.Last() - '1' == chuandishuju.daan.ToUpper().Trim().First() - 'A') ? "正确!" : "错误!";

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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