ASP.Net 中的持久动态控制

2023-11-24

<asp:Button onclick="Some_event" Text="Add TextBox" ID="id1" runat="server" />
//once clicked:
<asp:TextBox ID="txt1" ......></asp:TextBox>
//when clicked again:
<asp:TextBox ID="txt1" ......></asp:TextBox>
<asp:TextBox ID="txt2" ......></asp:TextBox>
//and so on...

有没有办法创建动态控件,即使在回发后仍会持续存在?换句话说,当用户单击该按钮时,将生成一个新的文本框,当再次单击时,将保留第一个文本框,同时生成第二个文本框。我怎样才能使用 asp.net 做到这一点?我知道如果我可以在 page_init 事件中创建控件,那么它们将持续存在,但我不知道是否可以在 page_init 发生之前处理按钮单击,因此必须有另一种方法。


是的,这是可能的。纯粹使用 ASP.NET(这似乎是您所要求的)来执行此操作的一种方法是记录TextBox您添加的控件(将该值存储在ViewState)并重新创建TextBox控制在Page_Load事件。当然,现在大多数人可能会使用 Javascript 或 jQuery 来处理客户端的此任务,但我整理了一个简单的示例来演示它如何与回发一起工作:

首页:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicControls.aspx.cs" Inherits="MyAspnetApp.DynamicControls" EnableViewState="true" %>
<!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"></head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btnAddTextBox" runat="server" Text="Add" OnClick="btnAddTextBox_Click" />
        <asp:Button ID="btnWriteValues" runat="server" Text="Write" OnClick="btnWriteValues_Click" />
        <asp:PlaceHolder ID="phControls" runat="server" />
    </div>
    </form>
</body>
</html>

背后代码:

using System;
using System.Web.UI.WebControls;

namespace MyAspnetApp
{
    public partial class DynamicControls : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recreate textbox controls
            if(Page.IsPostBack)
            {
                for (var i = 0; i < TextBoxCount; i++)
                    AddTextBox(i);
            }
        }

        private int TextBoxCount
        {
            get 
            {
                var count = ViewState["txtBoxCount"];
                return (count == null) ? 0 : (int) count;
            }
            set { ViewState["txtBoxCount"] = value; }
        }

        private void AddTextBox(int index)
        {
            var txt = new TextBox {ID = string.Concat("txtDynamic", index)};
            txt.Style.Add("display", "block");
            phControls.Controls.Add(txt);
        }

        protected void btnAddTextBox_Click(object sender, EventArgs e)
        {
            AddTextBox(TextBoxCount);
            TextBoxCount++;
        }

        protected void btnWriteValues_Click(object sender, EventArgs e)
        {
            foreach(var control in phControls.Controls)
            {
                var textBox = control as TextBox;
                if (textBox == null) continue;
                Response.Write(string.Concat(textBox.Text, "<br />"));
            }
        }
    }
}

由于您在每次回发时重新创建控件,因此输入到文本框中的值将在每次回发时保留。我添加了btnWriteValues_Click快速演示如何从文本框中读取值。

EDIT
我更新了示例以添加包含文本框和删除按钮的面板。这里的技巧是“删除”按钮不会删除容器面板,它只是使其不可见。这样做是为了使所有控件 ID 保持相同,因此输入的数据保留在每个 TextBox 中。如果我们完全删除 TextBox,被删除的 TextBox 之后的数据将在下一次回发时向下移动一个 TextBox(只是为了更清楚地解释这一点,如果我们有 txt1、txt2 和 txt3,并且我们删除 txt2,在下一次回发时,我们将创建两个文本框,txt1 和 txt2,txt3 中的值将丢失)。

public partial class DynamicControls : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            for (var i = 0; i < TextBoxCount; i++)
                AddTextBox(i);
        }
    }

    protected void btnAddTextBox_Click(object sender, EventArgs e)
    {
        AddTextBox(TextBoxCount);
        TextBoxCount++;
    }

    protected void btnWriteValues_Click(object sender, EventArgs e)
    {
        foreach(var control in phControls.Controls)
        {
            var panel = control as Panel;
            if (panel == null || !panel.Visible) continue;
            foreach (var control2 in panel.Controls)
            {
                var textBox = control2 as TextBox;
                if (textBox == null) continue;
                Response.Write(string.Concat(textBox.Text, "<br />"));
            }
        }
    }

    private int TextBoxCount
    {
        get 
        {
            var count = ViewState["txtBoxCount"];
            return (count == null) ? 0 : (int) count;
        }
        set { ViewState["txtBoxCount"] = value; }
    }

    private void AddTextBox(int index)
    {
        var panel = new Panel();
        panel.Controls.Add(new TextBox {ID = string.Concat("txtDynamic", index)});
        var btn = new Button { Text="Remove" };
        btn.Click += btnRemove_Click;
        panel.Controls.Add(btn);
        phControls.Controls.Add(panel);
    }

    private void btnRemove_Click(object sender, EventArgs e)
    {
        var btnRemove = sender as Button;
        if (btnRemove == null) return;
        btnRemove.Parent.Visible = false;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net 中的持久动态控制 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 为多语言 ASP.NET WebAPI 应用程序设置 CurrentCulture 的最佳位置

    基于这个问题 为多语言 ASP NET MVC Web 应用程序设置 CurrentCulture 的最佳位置 https stackoverflow com questions 8226514 best place to set curr
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 对于张量流中的二元分类,成本函数始终返回零

    我在张量流中编写了以下有问题的二进制分类程序 无论输入是什么 成本始终为零 我正在尝试调试一个较大的程序 该程序没有从数据中学习任何内容 我已经将至少一个错误缩小到总是返回零的成本函数 给定的程序使用一些随机输入并且存在相同的问题 self
  • 如何使用用户生成的整数数组填充 dataGridView

    有了这个 dataGridView DataSource theData Select x index gt new CreatureRoll x CreatureLabel index OrderByDescending x gt x C
  • 在 VHDL 中找到运算符“+”的“0”定义

    首先我想指出 这是我第一次尝试 VHDL 所以请客气一点 我想读取 X1 X4 输入并在输出处生成输入的总和 这是我的代码 library IEEE use IEEE STD LOGIC 1164 ALL entity counter of
  • 在 C# 中手动验证 JWT 令牌

    我遇到了一些麻烦手动验证Identity Server 4 颁发的 JWT 令牌 使用 客户端 ID CLIENT1 客户端密码 123456 我不断收到的异常是 IDX10501 签名验证失败 无法匹配密钥 PII 默认情况下是隐藏的 将
  • 如何在 SwiftUI 中获取拖放文件的文件名?

    我一直在尝试找出如何获取放入 SwiftUI 视图中的图像的文件名 代码片段如下 struct MainView View DropDelegate ObservedObject var userState UserState var bo
  • 新行 \n 在 JButton.setText("fnord\nfoo") 中不起作用; [复制]

    这个问题在这里已经有答案了 在 JButton 上 我想在多行上列出信息 我试过 n作为新行字符但它不起作用 以下代码 JButton setText fnord nfoo 将显示为 fnordfoo 如何强制换行 JButton 接受 H
  • 代码文档:多少算太多?

    NET 源代码中有多少代码文档过多 一些背景 我继承了一个大型代码库 我在我在这里发布的一些其他问题中讨论过该代码库 该代码库的 功能 之一是 God Class 它是一个静态类 包含超过 3000 行代码 包含几十个静态方法 一切都是从U
  • std::map 放置而不复制值

    C 11std map
  • Java 中 TreeSet 操作的计算复杂度?

    我试图澄清一些有关 TreeSet 某些操作的复杂性的事情 在 javadoc 上它说 该实施提供了 保证 log n 时间成本 基本操作 添加 删除和 包含 到目前为止 一切都很好 我的问题是 addAll removeAll 等发生了什
  • Facebook Like 按钮导致水平滚动条

    我最近在我的网站上添加了一个类似 facebook 的按钮 它会导致在不需要时出现水平滚动条 它不会出现在 Chrome 中 但会出现在 Firefox 和 IE 中 我已经检查了 Firebug 中创建的代码 但看不出出了什么问题 这是该
  • 量角器 browser.actions().mouseMove() 不显示悬停效果

    我是量角器新手 尝试为默认情况下关闭的滑块面板添加 测试 并将鼠标悬停在其上将打开它 然后滑块面板上有一个项目列表可供选择 div class slider 我尝试了多种方法 但没有一个有效 第一次尝试 没有悬停效果 即不执行任何操作 br
  • 引导类路径未与 -source 1.6 一起设置

    我正在将我的应用程序从 java 1 6 升级到 1 7 当我尝试使用 Maven 3 2 1 进行构建时 我的构建失败并显示以下错误消息 ERROR Failed to execute goal org apache maven plug
  • HBase 如何跨区域服务器对表进行分区?

    请告诉我 HBase 如何跨区域服务器对表进行分区 例如 假设我的行键是从 0 到 10M 的整数 并且我有 10 个区域服务器 这是否意味着第一个区域服务器将存储键值为 0 10M 的所有行 第二个 1M 2M 第三个 2M 3M 第十个
  • 使用 jquery 将数据发送到 MVC 控制器

    我有一个 ASP NET MVC3 应用程序 当用户单击我的锚标记时 我想将 3 条数据发送到操作 a a 这是调用我的操作的 javascript function editDescription docId fileName descr
  • curl 命令返回 http/1.1 406 不可接受的错误

    我使用下面的命令行curl来了解我的网站是否支持压缩和缓存 curl head compress http www mysite com 它返回以下结果 Http 1 1 406 Not Acceptable Date Wed 28 Dec
  • sed 打印替换行两次

    我正在运行以下命令 find home debajdas checkout name pom xml or name properties xargs sed i s 10 0 0 0 3 10 0 0 0 4 gpw changes 但它
  • 为什么我导入的 PNG 质量这么低

    我在做 android background drawable mobile vforum bg 在 main xml 文件中设置 BG 它可以工作 只是在模拟器上查看时图像质量非常差 它是 320x480 的 PNG 96dpi 低 中和
  • 完成脚本后关闭电脑

    我正在 R 中运行一个脚本 需要花费很多小时 我希望我的电脑在完成脚本后自动关闭 那可能吗 我怎样才能使用 R 做到这一点 我已经搜索了相关的包和函数 但找不到 谢谢 附 我的电脑运行 Windows 8 1 您可以直接从 R 调用 cmd
  • java中的PreparedStatement.addBatch有什么限制吗?

    我正在尝试优化将大量结果插入远程 mySQL 数据库的过程 我为此使用简单的 jdbc 目前 我正在用PreparedStatement替换现有语句 并用addBatch executeBatch方法替换执行方法 有谁知道批量执行的限制是什
  • ASP.Net 中的持久动态控制