【问题标题】:why controls inside a gridview (which is inside a user control) do not retain their properties' values after a postback?为什么gridview中的控件(在用户控件中)在回发后不保留它们的属性值?
【发布时间】:2013-02-08 19:31:38
【问题描述】:

我的页面有 5 个相同类型的用户控件。每个用户控件都有一个 gridview 和几个按钮。

我不明白为什么用户控件上的控件不能保留其价值。

编辑

下面是我如何在用户控件中填充 gridview。

    protected void Page_Load(object sender, EventArgs e)
    {
        var list = new List<CKListByDprtment>
        {
            new CKListByDprtment { ID = 1, TaskName = "New laptop needed", 
            CompletedBy = "My Boss", HMReq = true },
            new CKListByDprtment { ID = 2, TaskName = "New Workstation needed",
            CompletedBy = "My Boss", HMReq = false }
        };

        gvCKList.DataSource = list;
        gvCKList.DataBind();        

    }
    #endregion

    #region GridView Validation
    protected void cvValidateGrid_ServerValidate(object sender, ServerValidateEventArgs args)
    {
        ValidateGrid();
    }

    private void ValidateGrid()
    {
        foreach (GridViewRow gvRow in gvCKList.Rows)
        {
            CheckBox ckHMreq = gvRow.Cells[0].FindControl("ckHMreq") as CheckBox;
        }
    }

我试图在主 aspx 页面上添加一个复选框。当页面回发时,checked 能够保留其价值。我也在用户控件上尝试过,但不在gridview内部。回发时,复选框保留其值。

看起来只有在网格视图内部,控件在回发后会丢失其值。我首先在 aspx 页面上添加了 ViewStateMode = "Enabled",然后在 usercontrol 上添加,最后在 gridview 本身上添加,但没有成功。

有什么原因吗?

【问题讨论】:

  • 您是在代码隐藏中动态添加用户控件还是在 aspx 页面中存在?
  • 它们出现在 aspx 页面中
  • 您在页面生命周期的哪个位置填充用户控件?我想知道视图状态 is 是否已恢复,但也许您正在重新填充数据并且它会被覆盖。用户控制人口代码周围有if(!Page.IsPostBack)吗?
  • 没有。我仍在构建页面。所以我更专注于验证(如你所见)。只需几行代码即可填充网格视图。关于我在后面使用的代码,请参阅 EDIT。
  • 从接受的答案来看,我想我是对的? :)

标签: asp.net user-controls


【解决方案1】:

在我看来,对于每个PostBack,您都在调用DataBind()。如果Page.IsPostBack 等于false,您应该只调用DataBind()

【讨论】:

  • 有道理。现在它保留了这些值。我忽略了 PageLoad 在其他事件处理程序开始执行之前发生的事实。
  • 视图状态在Page_Load之前恢复。如果您调用gvCKList.DataBind(),您将覆盖网格的子控件。 :)
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多