DataBind()的疑问
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataBind()的疑问相关的知识,希望对你有一定的参考价值。
代码如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.htmlControls;
using System.Data.SqlClient;
namespace aaaa
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.WebControls.DataList dlMyList;
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
#endregion
private void Page_Load(object sender, System.EventArgs e)
Response.Write("<center><b><u>具有交替列的数据列表</center></b></u><br>");
if(!this.Page.IsPostBack)
DataTable mydt = new DataTable();
DataRow mydr;
mydt.Columns.Add(new DataColumn("Numbers", typeof(Int32)));
mydt.Columns.Add(new DataColumn("Squares", typeof(Int32)));
mydt.Columns.Add(new DataColumn("Cubes", typeof(Int32)));
for(int i = 0; i < 30; i++)
mydr = mydt.NewRow();
mydr[0] = i;
mydr[1] = i * i;
mydr[2] = i * i * i;
mydt.Rows.Add(mydr);
this.dlMyList.DataSource = mydt;
this.DataGrid1.DataSource = mydt;
this.DataGrid1.DataBind();
this.dlMyList.DataBind();
private void Button1_Click(object sender, System.EventArgs e)
this.DataBind();
为什么一开始页面加载的时候能看见DataGrid和DataList里面的数据,但当我按了Button1的时候,DataGrid和DataList里面的数据却都消失了,请问这个是为什么?
大虾们,能把原因说清楚吗?我很想知道原因
你的修正方法有两个,一个就是在Page_Load中不要判断是否提交,就是把if(!this.Page.IsPostBack) 去掉
另一个就是把数据绑定在Button1_Click里再做一遍:
private void Button1_Click(object sender, System.EventArgs e)
DataTable mydt = new DataTable();
DataRow mydr;
mydt.Columns.Add(new DataColumn("Numbers", typeof(Int32)));
mydt.Columns.Add(new DataColumn("Squares", typeof(Int32)));
mydt.Columns.Add(new DataColumn("Cubes", typeof(Int32)));
for(int i = 0; i < 30; i++)
mydr = mydt.NewRow();
mydr[0] = i;
mydr[1] = i * i;
mydr[2] = i * i * i;
mydt.Rows.Add(mydr);
this.dlMyList.DataSource = mydt;
this.DataGrid1.DataSource = mydt;
this.DataGrid1.DataBind();
this.dlMyList.DataBind();
本回答被提问者采纳 参考技术B private void Button1_Click(object sender, System.EventArgs e)
this.DataBind();
这个不对。
不要这样写。
你把绑定那一段代码,就是Page_onload中的,那些,整理出来,做一个方法。点按钮是,触发这个方法就行了。 参考技术C ls正确,是标准做法
不过象你的例子,你的button里没做任何事情。那么只需要把里 Page_Load里if(!this.Page.IsPostBack) 这个判断去掉就可以了
原因:ispostback判断页面是第一次加载,还是回发数据。你加了这个判断,也就是页面加载时你bingding了数据,而回发没有bingding数据 参考技术D private void Page_Load(object sender, System.EventArgs e)
if(!this.Page.IsPostBack)
nDataBind();
private void nDataBind()
DataTable mydt = new DataTable();
DataRow mydr;
mydt.Columns.Add(new DataColumn("Numbers", typeof(Int32)));
mydt.Columns.Add(new DataColumn("Squares", typeof(Int32)));
mydt.Columns.Add(new DataColumn("Cubes", typeof(Int32)));
for(int i = 0; i < 30; i++)
mydr = mydt.NewRow();
mydr[0] = i;
mydr[1] = i * i;
mydr[2] = i * i * i;
mydt.Rows.Add(mydr);
this.dlMyList.DataSource = mydt;
this.DataGrid1.DataSource = mydt;
this.DataGrid1.DataBind();
this.dlMyList.DataBind();
private void Button1_Click(object sender, System.EventArgs e)
nDataBind();
这样就可以了啊!
快试试吧! 第5个回答 2007-09-29 if(!this.Page.IsPostBack)这句话的意思是从外面加载,如果从本页加载就不会执行。
点按钮时它不会执行if(!this.Page.IsPostBack)方法中的代码!如果想让它的值不消失,可以放在viewStart里。
FormView.FindControl() 在 DataBind() 之前返回 null
【中文标题】FormView.FindControl() 在 DataBind() 之前返回 null【英文标题】:FormView.FindControl() returns null until DataBind() 【发布时间】:2011-01-11 09:38:06 【问题描述】:为什么方法FindControl()
在FormView
上返回null
直到调用DataBind()
。
之后它会正确返回所有内容吗?
有什么解决方法?
在第一次拨打FindControl()
之前先拨打DataBind()
?
【问题讨论】:
【参考方案1】:要么显式调用 DataBind(),要么将代码放在 FormView 的 DataBound 事件中。
【讨论】:
【参考方案2】:FormView
在有任何数据可以构建它之前如何获得有关其内容的任何信息?
所以我猜你已经回答了你自己的问题,你必须先DataBind()
。
【讨论】:
如果 DataBound() 函数中的控件在数据绑定发生后才可用,如何访问该控件?我在 OnDataBound 回调中,但 FindControl 返回 null。【参考方案3】:它与 BINDING 无关。一个是寻找服务器控制,而不是它的绑定数据。 SO - 控制应该可以通过 FindControl 获得。原因在别的地方……
【讨论】:
这确实是 FormView.NamingContainer 的众所周知的行为。【参考方案4】:这很奇怪。仅调用 DataBind() 对我不起作用。我必须创建一个新列表,添加一个项目,设置为数据源,然后是数据仓。
List<Item> dummyList = new List<Item>();
dummyList.Add(new Item());
formview.DataSource = dummyList;
formview.DataBind();
【讨论】:
【参考方案5】:我的经历是这样的,
System.Web.UI.HtmlControls.HtmlImage bookmarkload = sessionDetail.FindControl("bookmarkimage") as System.Web.UI.HtmlControls.HtmlImage;
返回null
。
所以,我这样做了:
protected void sessionDetail_DataBound(object sender, EventArgs e)
LoadBookmarkImage();
private void LoadBookmarkImage()
//if (_swapDetails != null)
//
try
_currnetSession = new SessionBL(_user);
List<SessionVO> _tmp = null;
string sample = Convert.ToString(Page.RouteData.Values["sessionCode"]);
if (Session["Prefernce"] != null)
_tmp = (List<SessionVO>)Session["Prefernce"];
if (_tmp != null && _tmp.Count > 0)
_tmp = _tmp.Where(p => p.SessionCode == sample).ToList();
//_currentFavorite.SessionD = _swapDetails[0];
_currentFavorite.SessionD = _tmp[0];
List<FavoriteVO> _swapList = _user.ViewFavoriteONID(_currentFavorite.SessionD.SessionID);
if (_swapList != null && _swapList.Count > 0)
//access javascript counter variable
ScriptManager.RegisterStartupScript(this, this.GetType(), "", "counter=1;", true);
System.Web.UI.HtmlControls.HtmlImage bookmarkload = sessionDetail.FindControl("bookmarkimage") as System.Web.UI.HtmlControls.HtmlImage;
bookmarkload.Src = "/Images/heart-checked.png";
catch (Exception ex)
labelinfo.Visible = true;
labelinfo.InnerHtml = ex.Message;
labelinfo.Attributes["class"] = "centering text-center text-danger";
//
【讨论】:
以上是关于DataBind()的疑问的主要内容,如果未能解决你的问题,请参考以下文章
漏洞预警FasterXML Jackson-databind多个反序列化漏洞
Fasterxml Jackson-databind漏洞分析与利用