我读过多个来源,说Gridview不会在回发上保留Gridview.DataSource属性。我的理解是,在ASP.NET的术语中,回发是任何不是第一个页面加载的页面加载(参见MSDN)。
我遇到了2个非常相似的网格视图的情况。
回发时GvOne.DataSource为空。
回发时GvTwo.DataSource不为null。
除了几个不同的列之外唯一的重大区别是GvOne填充了Entity Framework和LINQ。 GvTwo由一个由SqlDataAdapter填充的DataTable填充。
此外,GvOne和GvTwo有一个带有TextBox的TemplateField,我用它来收集用户输入。两者都使用相同的代码在回发时拉动TextBox.Text:
TextBox tb = (TextBox)GvOne.Rows[i].FindControl("actualTxt");
GvOne正确收集了tb.Text。 GvTwo 总是发现tb.Text值为0 。
基本网格视图代码:
<asp:GridView ID="GvOne" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="Return">
<ItemTemplate>
<asp:TextBox id="actualTxt" runat="server" Text='0' Width="40px"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
</asp:GridView>
<asp:GridView ID="GvTwo" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="Order">
<ItemTemplate>
<asp:TextBox id="actualTxt" runat="server" Text='0' Width="40px"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
</asp:GridView>
将GvTwo更改为使用Entity Framework和LINQ是一种潜在的解决方案,尽管这是一项重大任务。有谁知道这里发生了什么?
更新(请参阅我对Joel Etherton的答案的评论) 由于受欢迎的需求,这里是为GvTwo填充Page_Load事件中的gridview的代码(GvOne类似):
ordersGV.DataSource = dataSetObject.Tables["activeParts"];
ordersGV.DataBind();
通过搜索后面的代码,我发现没有其他对ordersGv.Datasource的引用,也没有其他与页面生命周期相关联的事件。
答案 0 :(得分:3)
你的Page_load代码是什么样的?
对于性能问题,GridView不会在回发上填充DataSource属性
也许第二个gridview在回发时重新绑定数据源?
答案 1 :(得分:3)
Gridviews不会在回发之间保留数据源。如果您的gridview具有非null数据源,那么您必须在代码中的某处填充该数据源。通过您的事件周期来查找回发时数据源的确切位置将是有益的。