我有一个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。但是现在,在回发时会发生以下情况:
TemplateFieldss中的复选框不显示
其中一个 columns是一个ImageField,它失去了它的“控制风格” “宽度/高度”参数,我得到了大量的图像。
这个问题只发生在回发上,删除以编程方式添加列的代码可以使一切工作完美。
我怎样才能让它发挥作用?
答案 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();方法称为页面第一次加载。
答案 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集合的末尾之外的某处插入动态控件可能会导致视图状态损坏。)