3

我有一个显示某些文件的详细信息的网格视图。它有 5 列,包括一个包含复选框的模板字段。

从后面的代码 OnInit 中,我添加了一些列以获取其他信息,这些信息可能需要也可能不需要,具体取决于页面。代码如下:

 for (int i = 0; i < models.Length && i < 3; i++)
            {
                var model = models[i];

                //Add gridview rows
                BoundField bf = new BoundField();
                bf.DataField = "Attribute" + i;
                bf.HeaderText = model.AttributeName;
                bf.Visible = true;

                gvFiles.Columns.Insert(6 + i, bf);

            }

这很好用,我得到了列。在 OnLoad 事件中,我将某些数据数据绑定到 gridview,并且效果也很好。

当回发发生时,问题就出现了。每当页面创建回发时,它都会执行 OnInit,然后崩溃并显示以下('on page')错误消息:

发生错误,因为无法找到 ID 为“ctl00$MainContent$gvFiles$ctl02$ctl00”的控件,或者在回发后将不同的控件分配给相同的 ID。如果未分配 ID,请显式设置引发回发事件的控件的 ID 属性以避免此错误。

我将导致问题的控件标识为 TemplateField 中的复选框,并给了它一个 ID。但是现在,在回发时会发生以下情况:

  1. TemplateFieldss 中的复选框未出现

  2. 其中一列是 ImageField,它失去了它的“控制样式宽度/高度”参数,我得到了大量的图像。

该问题仅在回发时发生,并且删除以编程方式添加列的代码会使一切正常工作。

我怎样才能让它工作?

4

5 回答 5

2

您需要在回发时重新创建一个动态添加的控件。

MSDN 建议在 PreInit 事件中创建控件。

在启动阶段完成后和初始化阶段开始之前引发。将此事件用于以下情况:

  • 检查 IsPostBack 属性以确定这是否是第一次处理页面。此时还设置了 IsCallback 和 IsCrossPagePostBack 属性。
  • 创建或重新创建动态控件。
  • 动态设置母版页。
  • 动态设置 Theme 属性。
  • 读取或设置配置文件属性值。
于 2013-12-10T14:04:32.053 回答
2

简单告诉我一条线解决方案

您需要在 Gridview 绑定方法中的 Page Load 事件中添加 !IsPostback

解释:

请参阅下面的代码示例

PageLoad()
{
BindGridview();
}

Public void BindGridview()
{
//Binding codes and add extra column codes
for (int i = 0; i < models.Length && i < 3; i++)
            {
                var model = models[i];

                //Add gridview rows
                BoundField bf = new BoundField();
                bf.DataField = "Attribute" + i;
                bf.HeaderText = model.AttributeName;
                bf.Visible = true;

                gvFiles.Columns.Insert(6 + i, bf);

            }
}

您已经在页面加载中调用了“ BindGridview ()”方法。每当您的页面加载时,都会创建相同的列字段。

您只需要在第一次加载页面时调用“ BindGridview()”方法。所以您非常需要!IsPostBack

请参阅下面的代码 | 或在 Page Init 事件中调用它

PageLoad()
{
if(!IsPostBack)
{
BindGridview();
}
}

现在 BindGridview(); 方法被称为页面第一次加载。

有关“IsPosteBack”属性的更多详细信息

于 2013-12-10T13:32:58.367 回答
0

如果您在 Post Back 上添加的列数与初始加载不同,则可能是问题所在。特别是当视图状态尝试加载时:

当基于某些条件将动态控件 c 添加到某个父控件 p 时(即,当不在每次页面访问时加载它们时),您需要确保将 c 添加到 p 的 Controls 集合的末尾。原因是因为 p 的视图状态也包含 p 的孩子的视图状态,并且,正如我们将在“解析视图状态”部分中讨论的那样,p 的视图状态通过 index 指定其孩子的视图状态。(图 5 说明了在 Controls 集合末尾以外的位置插入动态控件如何导致损坏的视图状态。)

http://msdn.microsoft.com/en-us/library/ms972976.aspx

于 2013-12-12T22:05:44.510 回答
0

如果if(!ispostback)您的 oninit 事件中有一个,则将其删除。动态控件只需要在 Oninit 事件的每次回发时创建。

如果未重新创建控件,则无法找到它,类似于您的情况。如果控件是在 PageLoad 上创建的,那么客户端值将无法访问,并且您将收到不同的错误。

希望这可以帮助。

于 2013-12-11T14:04:37.247 回答
0

复选框和图像有问题导致 css 由于错误而失败。您遇到的错误是,当您进行回发时,已经有一行包含您之前添加的数据,因此要解决此问题,您需要以下代码:

protected void Page_Init(object sender, EventArgs e)
    {


        if (Page.IsPostBack)
        {
         gvFiles.DataBind();

        }

    }
于 2013-12-12T01:39:29.737 回答