1

我以这种方式创建了一系列单选按钮:

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,为什么它没有改变?

4

2 回答 2

1

这个问题缺少很多上下文,但考虑到您编写网站的方式完全奇怪,我想问题在于您从未添加单选按钮来控制页面的控制层次结构。另外,我猜您是在 Page_Load 事件而不是 Page_Init 事件中创建单选按钮,这是一个问题,因为它们不会从回发中获取点击,因为它们是在ASP.NET 处理点击之后添加的.

如果这对您没有任何意义,那么您需要阅读更多关于 ASP.NET 如何工作的内容。您不能完全将其视为桌面应用程序。事件及其处理程序由 HTTP 帖子分隔,导致您在创建和初始化控件的方式和位置方面变得敏感。

于 2013-05-12T19:46:04.633 回答
1

摆脱所有会话状态的东西,被点击的按钮作为“发送者”传递给事件处理程序。要访问被单击的单选按钮,只需将其转换为单选按钮,您的对象就在此处:

RadioButton r = (RadioButton)sender;

您最好使用 RadioButtonList 而不是您正在设置的 Session 变量。然后只需在页面上添加 RadioButtonList 并在循环中添加按钮:

myRbl.Items.Add(new ListItem("text", i.ToString(), true));
于 2013-05-12T19:50:20.477 回答