我有两个字符串列表,我想动态创建一个文本框网格:
List<string> X = {"A", "B", "C"};
List<string> Y = {"1", "2", "3", "4"};
A B C
1 TBX TBX TBX
2 TBX TBX TBX
3 TBX TBX TBX
4 TBX TBX TBX
[Button]
当我在文本框中输入数据并单击按钮时,我希望能够遍历这些文本框并确定与每个文本框关联的"X“和"Y”坐标。
我可能知道如何动态创建这个文本框网格,但我认为在发布数据时会遇到问题。如何在回发后从动态创建的文本框中获取值?
我做迭代和实际逻辑没有问题,但我不知道如何将数据放入容器中以便可以迭代。在读取发布的数据时,我是否需要再次动态创建文本框?那看起来像什么?
发布于 2012-07-03 02:20:02
这是另一种方法。您可以在asp.net页面中使用占位符。在代码后台中,动态创建一个包含动态文本框的表格,并将其插入到占位符中。在这种情况下,您可以控制每个文本框的ID。在回发时,输入到文本框中的值将被保留(因为ID是确定的,所以您也可以进行javascript操作)
这里的是aspx。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicControls.aspx.cs" Inherits="Test2.DynamicControls" %>
<!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">
<div>
<asp:PlaceHolder ID="PHDynamicTable" runat="server"></asp:PlaceHolder>
<asp:Button runat="server" ID="btnSubmit" Text="Submit"
onclick="btnSubmit_Click" />
</div>
</form>
</body>
</html>
背后的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Test2
{
public partial class DynamicControls : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
CreateTextBoxesInTable();
}
private void CreateTextBoxesInTable()
{
PHDynamicTable.Controls.Clear();
List<string> X = new List<string>() { "A", "B", "C" };
List<string> Y = new List<string>() { "1", "2", "3", "4" };
Table table = new Table();
table.ID = "dynamicTable";
TableRow tr;
foreach (string y in Y)
{
tr = new TableRow();
foreach (string x in X)
{
TableCell tc = new TableCell();
TextBox textBox = new TextBox();
textBox.ID = "txt_" + x + y;
tc.Controls.Add(textBox);
tr.Cells.Add(tc);
}
table.Rows.Add(tr);
}
PHDynamicTable.Controls.Add(table);
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (PHDynamicTable.Controls.Count > 0)
{
Table dynamicTable = (Table)PHDynamicTable.FindControl("dynamicTable");
if (dynamicTable != null)
{
foreach (TableRow tr in dynamicTable.Rows)
{
foreach (TableCell tc in tr.Cells)
{
TextBox textBox = (TextBox)tc.Controls[0];
string text = textBox.Text;
//Do whatever you want with the control
}
}
}
}
}
}
}
少量屏幕截图
带有数据的输入屏幕
回发时(提交)
提交后
发布于 2012-07-03 00:17:04
抛开可用性问题不谈,我将假设您使用的是ASP.NET Webforms,而不是ASP.NET MVC。在webforms中,这就像是一场噩梦。你当然可以嵌套两个控件。一个控件的数据源成为第一个列表,第二个数据源成为第二个列表。然后在二级中继器模板中放入你的asp:textbox。但是,这里的ID即使显式设置,实际上也是一个生成值,因为中继器在ASP.nET Webforms中称为命名容器;这意味着ID的值将在运行时更改。
在回发时,可以遍历父中继器的控件树以查找子中继器。然后,在子中继器中,您可以遍历该中继器的控件以找到您的文本框。类似于:
<asp:Repeater>
<itemtemplate>
<asp:repeater>
<itemtemplate>
<asp:textbox />
</itemtemplate>
</asp:repeater>
</itemtemplate>
</asp:repeater>
然后在代码隐藏中,在回发伪代码上
foreach(Control c in myTopRepeater.Controls){
if(c == RepeaterControl) //is of type repeater. again, pseudo code
{
foreach(Control subC in c)
{
if(subC == textBox)
{
//Compare generated name, etc to my Lists
}
}
}
}
阅读有关命名容器的内容可能会有所帮助。你可以得到一个可预测的命名设置,但它不是100%直观的。http://www.4guysfromrolla.com/articles/031710-1.aspx
祝好运!
https://stackoverflow.com/questions/11302722
复制相似问题