1
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 事件时,如何更改复选框的选中状态并捕获它的当前状态?

4

2 回答 2

1

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

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

还有一个

您必须在 Page_Load 之前添加控件

我通常在被覆盖的情况下这样做,CreateChildControls但有些人使用Page_Init.

这篇文章

更新

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

    <%@ 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";
    }

}
于 2011-12-08T10:03:07.920 回答
0

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

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

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

如果您需要在该Page_Load(object sender, EventArgs e)方法中创建控件,这个问题应该有助于如何在回发时保留变量

于 2011-12-08T11:05:27.080 回答