关于ASP.NET中DatGrid的一个疑问,请高手解释.
这是实现了当记录被删除后,可以自动绑定,也就是删除完了自动更新页面,显示删除过的页面,像刷新一样.
程序的源码如下:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
Bind();
}
}
private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
sqlDataAdapter1.DeleteCommand.Parameters[ "@ID "].Value = DataGrid1.DataKeys[e.Item.ItemIndex];
sqlConnection1.Open();
sqlDataAdapter1.DeleteCommand.ExecuteNonQuery();
sqlConnection1.Close();
Bind();
}
private void Bind()
{
sqlDataAdapter1.Fill(ds, "table1 ");
DataGrid1.DataSource = ds;
DataGrid1.DataBind();
}
可是我有一个疑问,如果把if(!Page.PostBack)去掉,会何会有问题呢,也就是说删除后,不能立刻看到效果,再删一次,才能看到上一次删除的效果.
我本来以为是DataSet的问题,所以我在Bind()方法中,第一行加了ds.Clear(),想先清除再填充,还是一样的问题,想问问这个到底是怎么回事,能解释清楚点最好,谢谢.
------解决方案--------------------首先你去掉if(!Page.PostBack)就是有问题,你为什么要去掉了,去掉这个就每次postback都要重新绑定,这是1个浪费,而且要明白,如果去掉if(!Page.PostBack),你点击删除按钮后是先执行page_load中的Bind()语句,然后才执行删除语句。
--------------------
PS:你应该是把if(!Page.PostBack)并且去掉了DataGrid1_DeleteCommand下面的Bind();才会出现你说的问题吧
------解决方案--------------------try:
在bind事件中.把连接打开用完后再关闭看看
------解决方案--------------------cpp2017(慕白兄) 已经讲的很清楚了,在bind()中,你用是private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)事件中的连接.
在bind()打开一个连接试一下
------解决方案--------------------Bind()的关键在于这一行:
DataGrid1.DataBind();
在这行代码里,DataGrid1重新从DataSource指向的DataSet获取数据,而如果这行不被执行DataGrid1和DataSet之间是没有任何联系的(即使DataSource已经指向DataSet)。即使DataSet的数据更新了(例如你所说的删除操作),DataGrid1也不会知道,仍然用旧的数据。
在你所提供的代码(也就是正确的逻辑)中,页面第一次加载时DataGrid1从DataSet获取数据,这个大家都明白。之后有些PostBack会改变DataSet(例如删除),而另外一些不会,所以我们仅仅在DataSet改变之后重新执行Bind(),这很好理解吧?那么如果不改变数据也执行Bind()呢?那纯粹是资源浪费,因为DataGrid1的数据和DataSet的数据本来就一致。
------解决方案--------------------LZ 把 DataGrid.EnableViewState=true/false 并选择使用与不使用 !IsPostBack 的情况,
就明白怎么回事了