日期:2014-05-18  浏览次数:20452 次

关于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 的情况,

就明白怎么回事了