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里面的数据却都消失了,请问这个是为什么?
大虾们,能把原因说清楚吗?我很想知道原因

参考技术A 因为你的绑定是在Page_Load中做的,所以一提交,跳过了绑定代码,当然就没有数据了,
你的修正方法有两个,一个就是在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漏洞分析与利用

FasterXML/Jackson-databind远程代码执行漏洞安全通告(CVE-2020-35728)

在DataBind之后添加列值

jackson.databind 没有这样的方法错误

com.fasterxml.jackson.databind.JsonSerializer 按键排除字段