【问题标题】:Dynamic radio button value retrieval动态单选按钮值检索
【发布时间】:2011-12-08 09:57:02
【问题描述】:
this.Controls.Add(new CheckBox{ Checked = true; })

当我在page_load 中添加这个时。它起作用了,它添加了复选框并且它是可见的。

有点不同的方法:

var button = new CheckBox{ Checked = true; } 
globals.button = button;
this.Controls.Add(button);

Globals 是一个带有复选框属性的类,我想在其上设置复选框,希望在按下按钮后检索它的数据。

public static CheckBox button { get; set; }

但是,当按下按钮时,我的屏幕上的控件消失了,并且我的全局类中的按钮没有更新为我对复选框所做的任何更改。

当我执行 button.click 事件时,如何更改复选框的选中状态并捕捉它的当前状态?

【问题讨论】:

    标签: c# asp.net radio-button dynamic-controls


    【解决方案1】:

    您必须在每次回发时重新创建动态控件,它们不会神奇地重新出现,因为每个请求都是 Page 类的新实例。

    请参阅我的 previous 关于此主题的帖子,它使用的是用户控件,但想法是一样的。

    And another

    必须在 Page_Load 之前添加控件

    我通常使用覆盖的CreateChildControls,但有些人使用Page_Init

    this article

    更新

    这是一种非常简单的动态添加复选框的方法,在单击按钮时保留状态/值。

        <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:PlaceHolder runat="server" ID="ph"></asp:PlaceHolder>
            <asp:Button OnClick="btn_Click" runat="server" ID="btn" Text="Click Me" />
    
            <asp:Label runat="server" ID="lbl"></asp:Label>
        </form>
    </body>
    </html>
    

    然后代码隐藏

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    
    public partial class Test : Page
    {
        private CheckBox MyCheckBox { get; set; }
        protected override void CreateChildControls()
        {
    
            this.MyCheckBox = new CheckBox() { Checked = true };
            this.ph.Controls.Add(this.MyCheckBox);
            base.CreateChildControls();
        }
    
        protected void btn_Click(object sender, EventArgs e)
        {
            var someValue = this.MyCheckBox.Checked;
            this.lbl.Text = someValue ? "Checked" : "Not Checked";
        }
    
    }
    

    【讨论】:

    • 再次添加控件不是问题。在单击按钮时获取值是我的问题。
    • 你说However, when a button is pressed, the control has vanished of my screen - 这表明你没有在每个回发中重新添加控件,如果没有添加,你将无法获得值
    • 我想从全局类中设置的复选框中获取值。
    • 从哪里来?该按钮仅存在于该一个请求中,一旦该请求完成,该按钮就消失了,您无法存储它并在以后检索它。如果您需要存储一个值以供以后使用,您可以使用SessionApplication
    • 所以我不能将按钮存储在不同的类中并在我回发后从那里访问它?我很确定我以前用文本框的 .. 做过这个,但我失去了那个项目`。 PS。我不能将控件创建放在 OnInit 或 CreateChildControl 中,因为它取决于下拉框的值
    【解决方案2】:

    如果在Page_Load(object sender, EventArgs e) 方法中创建动态控件,它们将不会返回用户所做的更改。

    您遇到问题的原因是在调用 Page_Load(object sender, EventArgs e) 方法之前创建了 ASP.Net 视图状态。 ASP.Net 视图状态保存页面上的控件及其值。在创建 ASP.Net 视图状态之前调用 Page_Init(object sender, EventArgs e) 方法。通过在Page_Init(object sender, EventArgs e) 方法中创建控件将返回用户输入的内容,此外,仅当页面不是回发时才需要创建控件。

    如果由于某种原因无法在Page_Init(object sender, EventArgs e) 方法中创建控件,您将编辑以更改Page_Load(object sender, EventArgs e) 的ASP.Net 视图状态。

    如果您需要在Page_Load(object sender, EventArgs e) 方法中创建控件,这个问题应该可以帮助How to Persist Variable on Postback

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2018-07-23
      • 1970-01-01
      • 2012-04-20
      • 2023-04-03
      • 1970-01-01
      • 2016-09-06
      相关资源
      最近更新 更多