【问题标题】:ASP.NET Control assign to property nullASP.NET 控件分配给属性 null
【发布时间】:2014-12-12 00:22:29
【问题描述】:

我有一段代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        _SearchResult.GridViewChanged += _SearchResult_GridViewChanged;
    }

    public Control GvControls { get; set; }

    protected void _SearchResult_GridViewChanged(object sender, Orders.GridViewChangedEventArgs e)
    {
        this.GvControls = e.GControl;            
    }

    protected void export_ServerClick()
    {
        new ExportGridView(this.GvControls,"report");
    }

一个控件使用事件 arg 生成一个事件并通过 arg 推送一个控件,然后其他(此)控件使用此 arg 做一些俯卧撑

我什么时候尝试推送 export_ServerClick() 属性 GvControls 等于 null 但之前不应该为 null。为什么会这样。

谢谢X

【问题讨论】:

    标签: c# asp.net events user-controls controls


    【解决方案1】:

    所有变量(甚至控件)都在页面生命周期结束时处置。这就是为什么您必须在回发时重新创建所有动态创建的控件的原因。出于同样的原因,您必须使用所需的值重新初始化变量。

    所以我假设GridViewChanged-事件首先被触发。然后用户单击触发export_ServerClick-event 处理程序的另一个按钮。此时字段GvControls 已获得其默认值null

    您必须在某处保留此值,例如在 Session 中。

    Nine Options for Managing Persistent User State in Your ASP.NET Application

    但是,我认为您不需要坚持控制本身。也许存储控件的 ID 就足够了。也许在导出之前从数据源再次加载它会更好,原因有两个:

    1. 显示的数据可能已经过时,因为其他用户已对其进行了更改
    2. 您无需在控件中摆弄字符串,但您拥有原始值

    【讨论】:

    • 但有可能public Control Table { get { return (Control)Session["gv"]; } set { Session["gv"] = value; } }
    • 是的,但如果你真的想在会话中存储数据,我更喜欢像 DataTable 这样的真实来源。
    • 但是我的 gridview 有一个特殊的格式——真的需要把这种格式委托给 excel
    • @aleks:但是为什么你需要保留网格本身,为什么只存储 id、name、type 或其他内容是不够的?网格在下一次回发时仍然可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多