从代码后面添加Gridview列的问题

时间:2013-08-30 13:44:11

标签: c# asp.net gridview

我有一个gridview,显示某些文件的一些细节。它有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. 其中一个 columns是一个ImageField,它失去了它的“控制风格” “宽度/高度”参数,我得到了大量的图像。

  3. 这个问题只发生在回发上,删除以编程方式添加列的代码可以使一切工作完美。

    我怎样才能让它发挥作用?

5 个答案:

答案 0 :(得分: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();方法称为页面第一次加载。

More details about "IsPosteBack" property

答案 1 :(得分:2)

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

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

  

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

     
      
  • 检查IsPostBack属性以确定这是否是第一次处理页面。此时还设置了IsCallback和IsCrossPagePostBack属性。
  •   
  • 创建或重新创建动态控件。
  •   
  • 动态设置母版页。
  •   
  • 动态设置Theme属性。
  •   
  • 读取或设置个人资料属性值。
  •   

答案 2 :(得分:0)

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

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

希望这有帮助。

答案 3 :(得分:0)

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

protected void Page_Init(object sender, EventArgs e)
    {


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

        }

    }

答案 4 :(得分:0)

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

  

根据某些条件(即,在每次访问时不加载它们时)将动态控件c添加到某个父控件p时,需要确保将c添加到p的Controls集合的末尾。原因是因为p的视图状态也包含p的子视图的状态,正如我们将在“解析视图状态”部分中讨论的那样,p的视图状态指定其子视图的状态。索引即可。 (图5说明了如何在Controls集合的末尾之外的某处插入动态控件可能会导致视图状态损坏。)

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

相关问题