请教一个动态创建控件的问题,200分一定给解决问题的

upshania 2009-10-28 06:45:05

-------------------------------------------问题描述-----------------------------------------------------------
我动态创建两个方法 ,一个动态创建12个文本框,一个创建365个文本框,当我在12个框里的第一个框输入值如:"你好",然后再动态创建365个框的时候,365个框的第一个框也会保留我前而输入的文本框的值"你好" ,这是怎么回事,知道的请指教一下,
我现在着急的是这个框会影响我后面的保存的值,所以知道的回答一下,分一定给,

-------------------------------------------前端代码-----------------------------------------------------------



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True">
<asp:ListItem>a</asp:ListItem>
<asp:ListItem>b</asp:ListItem>
</asp:RadioButtonList>
<asp:Table ID="Table1" runat="server">
</asp:Table>
 
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" /></div>
</form>
</body>
</html>



-------------------------------------------后端代码-----------------------------------------------------------

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{


bind();

}

private void bind()
{

TableRow tr;

tr = new TableRow();
if (this.RadioButtonList1.SelectedValue == "a")
{
bindYear(tr);
}
else
{
bindMonth(tr);
}

this.Table1.Rows.Add(tr);
}

private void bindMonth(TableRow tr)
{
int year = DateTime.Now.Year;
TableCell th;
for (int i = 0; i < 12; i++)
{
th = new TableCell();
TextBox tb = new TextBox();
tb.Width = Unit.Pixel(50);
th.Controls.Add(tb);
tr.Cells.Add(th);
}

}


private void bindYear(TableRow tr)
{
int year = DateTime.Now.Year;
TableCell th;
for (int i = 0; i < 365; i++)
{
th = new TableCell();
TextBox tb = new TextBox();
tb.Width = Unit.Pixel(50);
th.Controls.Add(tb);
tr.Cells.Add(th);
}

}


protected void Button1_Click(object sender, EventArgs e)
{



// Response.Write(tb.Text);
}
protected void Button2_Click(object sender, EventArgs e)
{

}
}












...全文
174 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy664618843 2009-10-29
  • 打赏
  • 举报
回复
int counts = 4;//创建四个控件
for (int i = 1; i <= counts; i++)
{
TableRow row = new TableRow();
TableCell cellHead = new TableCell();
TableCell cellContent = new TableCell();
Label LabelAuditing = new Label();
TextBox TextAuditing = new TextBox();
LabelAuditing.ID = "LabelAuditing" + i.ToString();
LabelAuditing.Text = "LabelAuditing" + i.ToString();
TextAuditing.ID = "TextAuditing" + i.ToString();
TextAuditing.Height = 18;
cellHead.Controls.Add(LabelAuditing);
cellContent.Controls.Add(TextAuditing);
cellHead.BackColor = System.Drawing.Color.FromName("#EFEFEF");
cellHead.BorderWidth = 1;
cellHead.BorderColor = System.Drawing.Color.FromName("#CCCCCC");
cellHead.HorizontalAlign = HorizontalAlign.Left;
cellHead.Width = 60;
cellContent.BorderColor = System.Drawing.Color.FromName("#CCCCCC");
cellContent.BackColor = System.Drawing.Color.FromName("#EFEFEF");
cellContent.BorderWidth =1;
cellContent.HorizontalAlign = HorizontalAlign.Left;
cellContent.Width = 100;
row.Cells.Add(cellHead);
row.Cells.Add(cellContent);
row.Height = 22;
this.Table1.BorderColor = System.Drawing.Color.FromName("#CCCCCC");
this.Table1.Width = 400;
this.Table1.Rows.Add(row);
}


获取控件的值
string str = string.Empty;
for (int i = 1; i <= 4; i++)
{
str += ((TextBox)this.FindControl("TextAuditing" + i.ToString())).Text+"<br>";
}
this.LabelMsg.Text = str;
puzhichen 2009-10-29
  • 打赏
  • 举报
回复
可以用ViewState来保存文本框的值!动态生成控件所填写的值在回传之后就会得不到!
conanhhy 2009-10-29
  • 打赏
  • 举报
回复
LZ,你的代码我改了下,你试下。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{


bind();

}

private void bind()
{

TableRow tr;

tr = new TableRow();
if (this.RadioButtonList1.SelectedValue == "a")
{
bindYear(tr);
}
else
{
bindMonth(tr);
}

this.Table1.Rows.Add(tr);
}

private void bindMonth(TableRow tr)
{
int year = DateTime.Now.Year;
TableCell th;
TextBox tb = null;
for (int i = 0; i < 12; i++)
{
th = new TableCell();
tb = new TextBox();
tb.Width = Unit.Pixel(50);
tb.ID = "Month" + i;
th.Controls.Add(tb);
tr.Cells.Add(th);
tb = null;
}

}


private void bindYear(TableRow tr)
{
int year = DateTime.Now.Year;
TableCell th;
TextBox tb = null;
for (int i = 0; i < 365; i++)
{
th = new TableCell();
tb = new TextBox();
tb.Width = Unit.Pixel(50);
tb.ID = "Year" + i;
th.Controls.Add(tb);
tr.Cells.Add(th);
tb = null;
}

}


protected void Button1_Click(object sender, EventArgs e)
{


// Response.Write(tb.Text);
}
protected void Button2_Click(object sender, EventArgs e)
{

}
}

[/code]
randomfeel 2009-10-29
  • 打赏
  • 举报
回复
page_load里加上if(!IsPostBack)
应该就不会有这个问题了

楼上有位也说得对,动态创建的控件,最好把id也定义上,需要时才好找
gongsun 2009-10-29
  • 打赏
  • 举报
回复
...
z109214114 2009-10-29
  • 打赏
  • 举报
回复
学习了..........
homepgdn 2009-10-28
  • 打赏
  • 举报
回复
if (!IsPostBack)
{
bind();
}
CRMNet 2009-10-28
  • 打赏
  • 举报
回复
学习的,如有必要,则收藏
leonbingo 2009-10-28
  • 打赏
  • 举报
回复
楼主,从asp.net的基本原理分析,当你动态创建了控件以后,页面被再次提交的话,在page_load事件以后,asp.net会尝试再次恢复控件的状态,这也就造就了asp.net的一个神奇现象,动态创建的控件的状态也可以得到保持。

所以分析楼主的code,第一次你动态生成了12个文本框,然后你输入了一个你好,等你dropdownlist选择a的时候,这个时候又重新创建了365个文本框,那么我们分析一下出现了什么情况,也就是说第一个文本框的值加入了状态回复,而你操作dropdownlist回传的时候,运行的是BindYear这个函数,这个函数创建了365个文本框,asp.net会尝试为第一个文本框回复状态,现在的第一个文本框是BindYear生成的,但是asp.net并不知道,依旧进行了状态恢复,于是,你好在year的文本框里面显示了。

那么解决方案就是,根据web control的状态恢复原理,你只需要在生成的时候为文本框设置一个唯一的id,那么你可以在bindmonth里面给文本框设置id为month1--month12,而bindyear方法里面,不妨设置id为year1--year365,这样两个函数生成的控件id不一样,那么就不会产生第一个对话框的你好被恢复到第二次生成的控件里面了。
zcw2009 2009-10-28
  • 打赏
  • 举报
回复
这样的话,还是用Dropdownlist控件
wuyq11 2009-10-28
  • 打赏
  • 举报
回复
<asp:Table ID="HolderTable" runat="server"></asp:Table>

protected override void OnLoad(EventArgs e)
{
CreateControl();
}
protected void createbutton_Click(object sender, EventArgs e)
{
if (ViewState["CreateControl"] == null)
{
ViewState["CreateControl"] = true;
CreateControl();
}
}
void CreateControl() {
if (ViewState["CreateControl"]==null) return;
for (int x = 0; x < 10; x++)
{
TableRow row = new TableRow();
for (int y = 0; y < 10; y++)
{
TableCell cell = new TableCell();
Textbox txt= new Textbox ();
txt.Text = string.Format(" x={0},y={1}", x, y);
txt.ID=string.Format("{0}{1}", x, y);
cell.Controls.Add(bt);
row.Cells.Add(cell);
}
HolderTable.Rows.Add(row);
}
}
protected void displaybutton_Click(object sender, EventArgs e)
{
for (int x = 0; x < 10; x++)
{
TableRow row = HolderTable.Rows[x];
for (int y = 0; y < 10; y++)
{
Textbox txt= (Textbox )row.Cells[y].Controls[0];
Response.Write(bt.Text);
}
}
}
Dobzhansky 2009-10-28
  • 打赏
  • 举报
回复
没有 id , 在回发恢复视图状态时, 就不好判断哪个是哪个了
cpp2017 2009-10-28
  • 打赏
  • 举报
回复
  private void bindMonth(TableRow tr)
{
int year = DateTime.Now.Year;
TableCell th;
for (int i = 0; i < 12; i++)
{
th = new TableCell();
TextBox tb = new TextBox();
tb.ID = "month" + i.ToString();
tb.Width = Unit.Pixel(50);
th.Controls.Add(tb);
tr.Cells.Add(th);
}

}


private void bindYear(TableRow tr)
{
int year = DateTime.Now.Year;
TableCell th;
for (int i = 0; i < 365; i++)
{
th = new TableCell();
TextBox tb = new TextBox();
tb.ID = "year" + i.ToString();
tb.Width = Unit.Pixel(50);
th.Controls.Add(tb);
tr.Cells.Add(th);
}

}
悔说话的哑巴 2009-10-28
  • 打赏
  • 举报
回复
使用Dropdowlist
skyboxgogo 2009-10-28
  • 打赏
  • 举报
回复
有些动态创建的控件是得不到值的。一般只有Dropdowlist可以使用。
「已注销」 2009-10-28
  • 打赏
  • 举报
回复
回传导致值丢失。
ivws_19 2009-10-28
  • 打赏
  • 举报
回复
if (!IsPostBack)
{
bind();
}
junloveyan 2009-10-28
  • 打赏
  • 举报
回复
我觉得,你应该在循环产生控件的位置把每个控件的实例id给附上 如tb.ID="a"+ i.ToString()
爪哇鹅 2009-10-28
  • 打赏
  • 举报
回复
我把你的后台代码改了一下,你试试看

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
TableRow tr;
protected void Page_Load(object sender, EventArgs e)
{

}

private void bindMonth(TableRow tr)
{
TableCell th;
for (int i = 0; i < 12; i++)
{
th = new TableCell();
TextBox tb = new TextBox();
tb.Width = Unit.Pixel(50);
th.Controls.Add(tb);
tr.Cells.Add(th);
this.Table1.Rows.Add(tr);
}

}


private void bindYear(TableRow tr)
{
TableCell th;
for (int i = 0; i < 365; i++)
{
th = new TableCell();
TextBox tb = new TextBox();
tb.Width = Unit.Pixel(50);
th.Controls.Add(tb);
tr.Cells.Add(th);
this.Table1.Rows.Add(tr);
}

}

protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
{


tr = new TableRow();
if (this.RadioButtonList1.Items[0].Selected==true)
{
bindYear(tr);
}
if (this.RadioButtonList1.Items[1].Selected == true)
{
bindMonth(tr);
}

}
}
liaoyukun111 2009-10-28
  • 打赏
  • 举报
回复
应该是回传了
if(!IsPostBack)
{
bind();

}

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧