我有一个网格视图,它显示了关于某些文件的一些细节。它有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事件中,我将某些数据数据库到网格视图,这同样有效。
当回发发生时,问题就会出现。每当页面创建回发时,它都会执行OnInit,然后使用以下(“on page”)错误消息崩溃:
出现错误是因为无法找到id 'ctl00$MainContent$gvFiles$ctl02$ctl00‘的控件,或者在回发后将不同的控件分配给相同的ID。如果没有分配ID,则显式设置引发回发事件的控件的ID属性,以避免此错误。
我识别了给出问题的控件为TemplateField中的复选框,并给了它一个id。但是,现在在回发时会发生以下情况:
这个问题只发生在回发上,删除按语法方式添加列的代码可以使一切正常工作。
我怎么才能让这个起作用?
发布于 2013-12-10 05:32:58
我只需告诉单行解决方案
在Gridview绑定方法中,需要在页面加载事件中添加!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()“方法,无论何时加载.The,都会创建相同的列字段。
您需要在第一次页面加载时调用"BindGridview()“方法-- only.So --您确实需要!IsPostBack
。
请参阅下面的代码\\,或者在Page Init事件中调用它。
PageLoad()
{
if(!IsPostBack)
{
BindGridview();
}
}
现在,BindGridview();方法称为第一次加载页面。
发布于 2013-12-10 06:04:32
您需要在回发时重新创建一个动态添加的控件。
MSDN建议在PreInit事件中创建控件。
在开始阶段完成和初始化阶段开始之前引发。使用此事件进行下列操作:
发布于 2013-12-11 06:04:37
如果oninit事件中有if(!ispostback)
,那么删除它。动态控件只需要在Oninit事件的每次回发时创建。
如果未重新创建控件,则无法找到该控件,类似于在您的情况下正在发生的情况。如果控件是在PageLoad上创建的,那么客户端的值将无法访问,您将得到一个不同的错误。
希望这能有所帮助。
https://stackoverflow.com/questions/18534433
复制相似问题