我托了一个table控件在前台页面中,在后台的Page_Load()中动态创建了行和列以及文本框填充了该table控件,用户在浏览器中输入文本框的值后点击“保存”按钮提交后,我居然能够在按钮的Button1_Click()函数中捕捉到该table中含有的文本框中值是用户输入的值,怎么会这样,不是提交后Page_Load()会重新加载,table的行和列以及文本框都会重新构建吗 该table中含有的文本框中值应该是空值才对呀?还有为什么用户提交数据过后页面能够保留上次输入文本框的值显示出来呢呢
aspx文件中代码: <div> <asp:Table ID="MyTable" runat="server"> </asp:Table> <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> </div> aspx.cs文件中代码: protected void Page_Load(object sender, EventArgs e) { int rows = 15;//15层 int columns = 15;//单层15房屋 Response.Write("Load:" + MyTable.Rows.Count); TableHeaderRow tr0 = new TableHeaderRow();//第0行展示房间序号 tr0.TableSection = TableRowSection.TableHeader;//添加<thead></thead> //首列显示“楼层” TableHeaderCell tdFirst = new TableHeaderCell(); //tdFirst.Text = "楼层"; //tdFirst.CssClass = "tabNothouse"; Label lbl0 = new Label(); lbl0.Text = "楼层"; lbl0.Width = new Unit("50px"); //lbl0.CssClass = "tabNothouse"; tdFirst.Controls.Add(lbl0); tr0.Cells.Add(tdFirst); for (int K = columns; K >= 1; K--) { TableHeaderCell td = new TableHeaderCell(); td.Text = K.ToString(); TextBox txt = new TextBox(); txt.Width = new Unit("50px"); td.Controls.Add(txt); //td.CssClass = "tabNothouse"; tr0.Cells.Add(td); } // mythead.Controls.Add(tr0); Literal theadStart = new Literal(); theadStart.Text = "<thead>"; //MyTable.Controls.Add(theadStart); MyTable.Rows.Add(tr0); //Literal theadEnd = new Literal(); //theadEnd.Text = "</thead>"; //MyTable.Controls.Add(theadEnd); for (int i = rows; i >= 1; i--) { TableRow tr = new TableRow(); TableCell td001 = new TableCell(); //td001.Text = i.ToString() + "层"; Label lbl001 = new Label(); lbl001.Text = i.ToString() + "层"; lbl001.Width = new Unit("50px"); lbl001.CssClass = "tabNothouse"; td001.Controls.Add(lbl001); //td001.CssClass = "tabNothouse"; tr.Cells.Add(td001); for (int j = columns; j >= 1; j--) { TableCell td = new TableCell(); td.Text = i.ToString() + j.ToString(); //td.CssClass = "tabCss"; TextBox txt = new TextBox(); //txt.Width = new Unit("50px"); txt.CssClass = "tabCss"; td.Controls.Add(txt); tr.Cells.Add(td); } MyTable.Rows.Add(tr); } } protected void Button1_Click(object sender, EventArgs e) { List<string[]> List = new List<string[]>(); int n = MyTable.Rows.Count; Response.Write("n="+n.ToString()); for (int i = 1; i <= 5;i++ ) { string[] strs = new string[5]; TableRow tr = MyTable.Rows[i]; for (int j = 1; j <= 5;j++ ) { TableCell td = tr.Cells[j]; TextBox txt = (TextBox)td.Controls[0];//★??设断点得知在这里获得的文本框的值为用户输入的值,可是该文本框不是刚刚跟随table在Page_Load(){}重新被创建的吗,什么时候被赋了这个值呢??★ strs[j-1] = txt.Text.Trim(); } List.Add(strs); } List<string[]> List2 = List; }
你在Page_Load()方法里面加一个if(!Page.IsPostBack){你要的方法}。
因为单击按钮,页面会发生回传,回传时有个页面生存周期的问题,在这个周期当中
Page_Load()方法必定执行。加一个if(!Page.IsPostBack),表示页面在首次加载执行里面的方法
而在页面回传时不会执行里面的方法,也就是你单击按钮的时候
还有为什么用户提交数据过后页面能够保留上次输入文本框的值显示出来呢呢?
这是因为ViewState的问题,你可是设置该控件EnableViewState=false就行了,默认情况下页面回传textbox必须的保存上次的数据的
非常感谢您的回答,if(!Page.IsPostBack)这个我能够理解,我只是不解textbox的值什么时候被赋了用户输入的值,我补充了代码,在帮我分析一下好吗
@JYsharp: 当你单击按钮时候,用户输入的值会覆盖你创建textbox的初始值,这个是页面生存周期的问题,你可以用viewstate保存上次的值,在你需要的时候用。
那么一大串ViewState可不是闹着玩的~
能详细用ViewState解释下“提交后Page_Load()会重新加载,table的行和列以及文本框都会重新构建,但是在按钮的Button1_Click()函数中该table中的文本框的值为用户提交过来的值,该table难道是在加载完Page_Load()之后、加载Button1_Click()之前被重新赋了值吗“这个问题吗 ,拜托了
@JYsharp: 贴下你Button1_Click()和Page_Load的代码。
这是ViewState自动为你保存的
页面回调Page.IsPostBack
ViewState啊,asp.net控件的视图状态,这是基本属性