我有一个GridView,它有一个指向ObjectDataSource的DataSourceID。 ObjectDataSource指向一个方法,该方法使用ObjectDataSource控件的TypeName,SelectMethod和SelectCountMethod属性返回LINQ IQueryable。发生的事情是数据在前期正确加载。但是,在回发时,如果我从GridView中删除行并尝试使用显式GridView.DataBind()重新绑定,则它不起作用。我知道LINQ正在返回正确的rowcount,因为我调用了countmethod并返回了正确的rowcount。这是一个简单的例子:
<asp:GridView ID="TestGridView" runat="server" PageSize="20"
AutoGenerateColumns="false" AllowPaging="true"
AllowSorting="false" DataSourceID="TestDataSource">
<Columns>
...
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="TestDataSource" runat="server"
EnablePaging="true" SelectCountMethod="GetDetailCount"
SelectMethod="GetDetails" TypeName="MyApp.PageClass" />
我尝试添加一个按钮并添加TestGridView.DataBind();方法。我已经尝试将其添加到Page_PreRender事件中。无论我尝试什么,它都无法正常工作。
正如有人在下面建议的那样,我也尝试过将它移到Page_Load,但没有去。这是我的代码的一个粗略示例:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// Set "initial" query parameters, then ...
BindData();
}
}
private void BindData()
{
// EDITED: Removed the code below since I'm not looking to delete the
// rows from the database, but rather get the GridView to rebind
// which its not.
////Remove all current rows from the GridView
//int colCount = TestGridView.Rows.Count;
//for (int x = 1; x <= colCount; x++)
//{
// TestGridView.DeleteRow(x);
//}
// Bind GridView to the ObjectDataSource
TestGridView.DataBind();
}
protected void RegenerateImageButton_Click(object sender, ImageClickEventArgs e)
{
// Set "updated" query parameters, then ...
BindData();
}
答案 0 :(得分:13)
网格视图不会在回发时重新绑定,它们的行将从视图状态撤回。在页面加载(或初始化?)时将gridview的DatasourceID重置为对象数据源ID将导致gridview反弹。
答案 1 :(得分:3)
愚蠢的想法,但您是否使用if(!Page.IsPostBack)
检查了网页加载事件?
来自ASP.NET Page Framework Overview:
Page_Load:在此活动期间,您可以执行一系列操作以首次创建ASP.NET页面或响应帖子产生的客户端事件。在此事件之前已恢复页面和控件视图状态。使用 IsPostBack 页面属性检查这是否是第一次处理页面。如果是第一次,请执行数据绑定。另外,读取和更新控件属性。
在哪里
Page_PreRender: PreRender事件在保存视图状态并呈现控件之前触发。您可以使用此事件对控件执行任何最后一刻操作。
实际上
因为页面框架是无状态和断开连接的模型,所以每次客户端请求.aspx页面时,在页面处理期间会发生很多事情......
因此,实际上,您可以在设置viewstate之前进行检查,而不是在viewstate恢复之后进行检查。检查if(!Page.IsPostBack)
的最常见位置通常在Page_Load事件中。
答案 2 :(得分:2)
您的示例显示
TestGridView.Columns.RemoveAt(0);
但你真的是说
TestGridView.Rows.RemoveAt(0);
(这是问题吗?)
答案 3 :(得分:2)
我有一个类似的问题,将TreeView动态绑定到XmlDataSource,后者在每次回发时更改了xml源。将EnableCache设置为false修复它。你试过这个吗? (考虑到Linq2sql对象已经缓存,如果你的IQueryable正在使用Linq2sql对象,那就是)
<asp:ObjectDataSource ID="TestDataSource" runat="server" EnableCaching="false"
EnablePaging="true" SelectCountMethod="GetDetailCount"
SelectMethod="GetDetails" TypeName="MyApp.PageClass" />
如果这不起作用,请尝试以上结合:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
BindData();
}
答案 4 :(得分:0)
在查看了更多的代码之后,我偶然发现了存储在ViewState中的页面属性值。一旦我将其更改为Session,它们就可以工作。
答案 5 :(得分:0)
我有类似的情况,无论我在更新后如何尝试数据绑定,行的更新值都没有显示。
GridView
绑定到ObjectDataSource
,问题发生在我将其支持对象从DataSet
切换到Entity Framework
查询后
为ViewState
启用GridView
为我做了诀窍,因此:
<asp:GridView ID="GridViewTransporters" PageSize="100"
runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="ObjectDataSourceTransporters"
DataKeyNames="Id" EnableViewState="True">