我用这种方式创建了一系列单选按钮:
RadioButton[] radio = new RadioButton[size];
for (int i = 0; i < size ; i++)
{
radio[i] = new RadioButton();
radio[i].ID = "voted"+i.ToString();
radio[i].GroupName = "voted";
Session[radio[i].ID] = radio[i];
}
当用户点击按钮时,事件为
protected void Votes_Click(object sender, EventArgs e)
{
RadioButton r=new RadioButton();
for (int i = 0; i < (int)Session["cancount"]; i++)
{
r=(RadioButton)(Session["voted" + i.ToString()]);
if (r.Checked)
{
//Do somethings;
}
}
}
但r.checked
的值始终是false
,为什么它没有改变?
答案 0 :(得分:1)
这个问题缺少大量的上下文,但鉴于你似乎在编写网站的方式完全奇怪,我想问题是你从未添加过单选按钮来控制页面的控件层次结构。另外,我猜你在Page_Load事件而不是Page_Init事件中创建了单选按钮,这是一个问题,因为它们不会从回发中获取点击,因为它们是在之后添加的单击由ASP.NET处理。
如果这对您没有任何意义,那么您需要阅读有关ASP.NET如何工作的更多信息。您无法像桌面应用程序那样对待它。事件及其处理程序由HTTP帖子分隔,从而使您对创建和初始化控件的方式和位置具有敏感性。
答案 1 :(得分:1)
摆脱所有会话状态的东西,被点击的按钮作为“发送者”传递给事件处理程序。要访问单击的单选按钮,只需将其转换为单选按钮,然后是您的对象:
RadioButton r = (RadioButton)sender;
您最好使用RadioButtonList而不是您正在设置的Session变量。然后只需在页面上添加RadioButtonList并在循环中添加按钮:
myRbl.Items.Add(new ListItem("text", i.ToString(), true));