gpt4 book ai didi

c# - ASP.Net 中的持久动态控件

转载 作者:太空狗 更新时间:2023-10-29 20:28:55 25 4
gpt4 key购买 nike

<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) 并在 Page_Load 事件中重新创建 TextBox 控件。当然,现在大多数人可能会使用 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 以快速演示如何从文本框中读取值。

编辑
我更新了示例以添加一个包含文本框和删除按钮的面板。这里的技巧是 Remove 按钮不会删除容器 Panel,它只是让它不可见。这样做是为了让所有控件 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;
}
}

关于c# - ASP.Net 中的持久动态控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5797268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com