当页面回发时,嵌入ASP.NET ListView的Web控件在ItemDataBound事件处理程序上丢失状态和传递值

如何解决当页面回发时,嵌入ASP.NET ListView的Web控件在ItemDataBound事件处理程序上丢失状态和传递值

| 这个问题是关于Web控件的一种非常奇怪的行为。请考虑以下内容。 情境 我有一个Web控件,用于显示一些数据。
MyWebControl.ascx
文件如下:
<%@ Control ViewStateMode=\"Enabled\" 
            Language=\"C#\" 
            AutoEventWireup=\"true\" 
            CodeFile=\"MyWebControl.ascx.cs\" 
            Inherits=\"MyWebControl\" %>

<div>
   <asp:Label ID=\"MyLabel1\" runat=\"server\"></asp:Label>
   <asp:Label ID=\"MyLabel2\" runat=\"server\"></asp:Label>
</div>
MyWebControl.ascx.cs
后面的代码是:
public partial class MyWebControl : 
      System.Web.UI.UserControl {
   protected string str1;
   protected string str2;

   public string Str1 {
      get { return this.str1; }
      set { this.str1 = value; }
   }
   public string Str2 {
      get { return this.str2; }
      set { this.str2 = value; }
   }

   protected void Page_Load(object sender,EventArgs e) {
      this.MyLabel1.Text = this.str1;
      this.MyLabel2.Text = this.str2;
   }
}
好吧,我以普通的Web形式在一个
ListView
的矿井中使用此控件。此网络表单称为
Default.aspx
,接下来,我展示其代码的一部分,仅显示
ListView
所在的代码:
<%@ Page Title=\"My page\" Language=\"C#\" AutoEventWireup=\"true\"
         CodeFile=\"Default.aspx.cs\" Inherits=\"_Default\" %>

<%@ Register TagPrefix=\"my\" TagName=\"MyWC\" Src=\"~/MyWebControl.ascx\" %>
...
...
<div>
   <asp:ListView ID=\"MyLV_ListView\" runat=\"server\" 
                 EnableViewState=\"true\" 
                 OnPreRender=\"MyLV_ListView_PreRender\" 
                 OnItemDataBound=\"MyLV_ListView_ItemDataBound\">
      <ItemTemplate>
         <my:MyWC ID=\"WC_MyWC\" runat=\"server\" />
      </ItemTemplate>
   </asp:ListView>
</div>
web8ѭ背后的Web表单代码为:
public partial class _Default : System.Web.UI.Page {
   protected void Page_Load(object sender,EventArgs e) {
      if (!this.IsPostBack) {
         DAO d = new DAO(...); /* This object will contain some data */
                               /* Data are somehow paged,changing index,we have other data */
                               /* Please do not worry about paging,it works,problem is another */
         d.PageIndex = 0;
         this.ViewState[\"DAO\"] = d; /* DAO is serializable */
         this.ViewState[\"PageIndex\"] = 0;
         Data[] data = d.GetData(); /* Returns an array of objects representing my data */
                                    /* Custom way of storing data in objects */
                                    /* GetData use the PageIndex to get only a range of results */
         this.MyLV_ListView.DataSource = data;
         this.MyLV_ListView.DataBind();
      }
   }
   protected void MyLV_ListView_ItemDataBound(object sender,ListViewItemEventArgs e) {
      if (e.Item.ItemType == ListViewItemType.DataItem) {
         ((MyWebControl)e.Item.FindControl(\"WC_MyWC\")).Str1 = 
            ((Data)e.Item.DataItem).DataField1;
         ((MyWebControl)e.Item.FindControl(\"WC_MyWC\")).Str2 = 
            ((Data)e.Item.DataItem).DataField2;
      }
   }
   protected void MyLV_ListView_PreRender(object sender,EventArgs e) {
      if (this.IsPostBack)
         this.MyLV_ListView.DataBind();
   }
   // A TreeView will cause the page to reload,// this is the handler called when a tree node is 
   // selected,the node is used to change the page 
   // for showing data in my listview.
   protected void MyLVPaging_TreeView_SelectedNodeChanged(object sender,EventArgs e) {
      this.ViewState[\"PageIndex\"] = int.Parse(this.MyLVPaging_TreeView.SelectedNode.Value);
      ((DAO)this.ViewState[\"DAO\"]).PageIndex = (int)this.ViewState[\"PageIndex\"];
      // After setting the new index,GetData will return another set of results
      this.MyLV_ListView.DataSource = ((DAO)this.ViewState[\"DAO\"]).GetData();
   }
}
问题 我有什么问题??? 好吧,当页面第一次加载时,我可以在列表视图中看到一些数据,因此一切正常。 当我选择另一个页面时,会导致页面重新加载并回发...我的
ListView
将显示正确的条目数,但其中没有数据。 Web控件的放置次数与检索到的数据记录的数量相同,但是Web控件中没有数据。 调试结果 我进行了一些调试会议,这是发生了什么,请跟我来,我想这非常重要。 首次加载页面 1)执行
Load
页面方法。 2)执行
ListView
ItemDataBound
事件处理程序。好吧,假设我在
DataSource
Data[]
数组中有三个元素,则该处理程序被调用了3次。在继续调试该方法时检查值,可以看到
((Data)e.Item.DataItem).DataField1
((Data)e.Item.DataItem).DataField2
是从
ListView
中的绑定数据源检索的正确值。 执行该方法后,调试器光标移至控件的
Page_Load
方法的
MyWebControl.ascx.cs
。通过检查变量,我可以看到发生了这种情况:
protected void Page_Load(object sender,EventArgs e) {
   this.MyLabel1.Text = this.str1; // <-- this.str1 has the correct value loaded in the list view itemdatabound event handler.
   this.MyLabel2.Text = this.str2; // <-- this.str2 has the correct value loaded in the list view itemdatabound event handler.
}
3)调用
ListView
PreRender
方法。 4)页面显示,一切正常! 在TreeView中选择节点后页面回发 1)执行
Load
页面方法,但不执行任何操作。 2)执行
MyLVPaging_TreeView_SelectedNodeChanged
。在这里,我可以看到所有内容都具有正确的值: 受保护的void MyLVPaging_TreeView_SelectedNodeChanged(object sender,EventArgs e){    this.ViewState [\“ PageIndex \”] =       int.Parse(this.MyLVPaging_TreeView.SelectedNode.Value); // <-新页面    ((DAO)this.ViewState [\“ DAO \”])。PageIndex =       (int)this.ViewState [\“ PageIndex \”]; // <-索引已保存    //设置新索引后,GetData将返回另一组结果    this.MyLV_ListView.DataSource =       ((DAO)this.ViewState [\“ DAO \”])。GetData(); // <-数据源已更改 } 3)执行
ListView
ItemDataBound
事件处理程序。好吧,在这里,调试我可以看到与以前相同的意思,我的意思是,我看到新的值,新的
Data
已绑定到
ListView
,实际上,我可以检查分配给模板项目的新值。 显然,和以前一样,执行该方法后,调试器光标将移至控件的
Page_Load
方法的
MyWebControl.ascx.cs
。 邪恶:我可以看到以下内容:
protected void Page_Load(object sender,EventArgs e) {
   // Note: inspecting this.IsPostBack I get true!
   this.MyLabel1.Text = this.str1; // <-- this.str1 is null and also this.MyLabel1.Text is null.
   this.MyLabel2.Text = this.str2; // <-- this.str2 is null and also this.MyLabel1.Text is null. view itemdatabound event handler.
}
  好!!!它丢失状态和其他值   通过列表视图   处理者!!!!!!!!! 我的问题 这到底是怎么回事??? 笔记 1)请不要过多地关注我如何管理
Load
PreRender
事件上的数据绑定...我觉得这不是错误!我想这与页面生命周期有关。但是,如果您认为这很重要,请告诉我。 2)ѭ35和它的功能
GetData()
是让您尽可能快地理解场景的一种方法,该场景稍微多了一些,但是结构与我在此处显示的相同。 谢谢您的帮助。     

解决方法

        从我的评论:   你为什么不动   来自this.MyLV_ListView.DataBind()   预渲染到SelectedNodeChanged?和   为什么需要字段str1和   您的UserControl中的str2?物业   Str1应该获取/设置this.MyLabel1.Text   和属性Str2应该获得/设置   this.MyLabel2.Text,因为   标签\的文本已经存储在   ViewState。 安德烈:   ...因此这些设置不是   要在负载中制造? 我:   您不需要等待任何事件   碰巧设置标签的文本。的   属性应直接导致   相应的标签,因此您的   字段str1和str2是冗余的。   他们将被处置在   页面生命周期与   标签的文本属性是   自动存储在ViewState中   跨回发。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res