大家好,现在遇到一个问题,我是用VS2003+ACCESS的
用DataGrid显视数据,有一个删除功能,点击后数据库中是已经删除了,但在网站上显视还在,要刷新才能消除,我也已经在删除后重新绑定了,为什么还是不行,以下是代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;namespace admin
{
/// <summary>
/// manage_news 的摘要说明。
/// </summary>
public class manage_news : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
this.databind();
Session["reload"]=null;
}
} private void databind()
{
OleDbConnection conn=db.conn();
conn.Open();
OleDbDataAdapter sda=new OleDbDataAdapter();
sda.SelectCommand=new OleDbCommand("select * from news order by ArticleID desc",conn); DataSet ds = new DataSet();
sda.Fill(ds,"news"); this.DataGrid1.DataKeyField="ArticleID"; DataView dv = ds.Tables[0].DefaultView; 
ViewState["Row"] = dv.Count;
this.DataGrid1.DataSource = dv;
this.DataGrid1.DataBind(); 
ds.Clear();
conn.Close();
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.DataGrid1.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemCreated);
this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.DataGrid1.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_DeleteCommand);
this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{ if(e.Item.ItemType==ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onmouseover","old=this.style.backgroundColor;this.style.backgroundColor='#f1f4f2'");
e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=old");
((LinkButton)(e.Item.Cells[3].Controls[0])).Attributes.Add("onclick","return confirm('你确认删除吗?');");
if(e.Item.Cells[1].Text=="2")
{
e.Item.Cells[1].Text="站内新闻";
}
else
{
e.Item.Cells[1].Text="行业新闻";
}
}
} private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
this.DataGrid1.CurrentPageIndex=e.NewPageIndex;
this.databind();
} private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
ListItemType elemType = e.Item.ItemType;  if (elemType == ListItemType.Pager) 

TableCell pager = (TableCell)e.Item.Controls[0]; 
Label la = new Label(); 
la.Text = "总记录数:<b>"+ViewState["Row"].ToString()+" </b>"; 
la.Text += "总页数:<b>"+this.DataGrid1.PageCount+" </b>"; 
la.Text += "当前页:<font color=red><b>"+(this.DataGrid1.CurrentPageIndex+1).ToString()+" </b></font>&nbsp;&nbsp;&nbsp;&nbsp; "; 
pager.Controls.AddAt(0,la);  }  } private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
   int idd=Convert.ToInt32(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
OleDbConnection condel = db.conn();
condel.Open();
OleDbCommand cmddel=new OleDbCommand("delete from news where ArticleID="+idd,condel);
cmddel.ExecuteNonQuery();
this.databind();


}
}
}

解决方案 »

  1.   

     
    ds.Clear(); 
    conn.Close(); 
    this.DataGrid1.DataBind(); 
    不知道是不是这个
      

  2.   

    很显然要刷新才能datagrid更新数据,你要不用ajax技术更新,要不页面刷新
      

  3.   

    "ds.Clear();  
    conn.Close();  
    this.DataGrid1.DataBind();"
    这些加与不加都一个样很多方法我都试过了,就是AJAX还没有试了,没有必要吧
      

  4.   

    我来说一说哈!
    在databind() 方法中 DataGrid1.DataSource 可以是ds;
    如果要得到Row 的行数也可以用ds获得啊.(ds.Tables["news"].rows.count 好像是,不太记得了.)
    你那个Delete事件里的this.DataGrid1.DataBind();中的this去掉试一试.
    还有:楼上说的用AJAX才能刷新,这是不对的.没有必要.提一点建议:
    可以把
    OleDbConnection conn=db.conn(); 
    conn.Open(); 
    OleDbDataAdapter sda=new OleDbDataAdapter(); 
    sda.SelectCommand=new OleDbCommand("select * from news order by ArticleID desc",conn); 
    等,这些东东提出来,方法接收一个string 类型的字符串,就是SQL语句.
    方法返回一个 DataSet ds;当然要是Fill();以后的.
    DataGrid1.DataSource = 提出来的这个方法的返回值啦.
    这样做多好啊!
    在下献丑了哈.
      

  5.   

    protected void DataGrid_Bind()
    {
        //你获取datasource的操作,假设产生dataTable DT,
        DataGrid1.DataSource=DT;
        DataGrid1.DataBind();
    }然后,每一次你进行了数据操作,都在操作最后把这个函数调用下,就OK了我用GridView,不喜欢DataGrid,那个东西操作起来很麻烦,相对来讲封装得不好
      

  6.   

    private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) 

       int idd=Convert.ToInt32(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString()); 
    OleDbConnection condel = db.conn(); 
    condel.Open(); 
    OleDbCommand cmddel=new OleDbCommand("delete from news where ArticleID="+idd,condel); 
    cmddel.ExecuteNonQuery(); 
    this.DataGrid1.CurrentPageIndex=-1;this.databind(); 
    } 要不你加一句我的有颜色的代码试试看,应该不会有问题了。
      

  7.   

    刚才发现一个问题,如果反数据库换成SQL2000 的话就一点问题都没有
      

  8.   

    刚才发现一个问题,如果反数据库换成SQL2000 的话就一点问题都没有,有谁可以知道这是怎么回事吗?
      

  9.   

    告诉大家,问题已经解决了,上面说用SQL2000就没有问题是因为SQL2000数据库用完会自动关闭连接,而ACCESS则没有这个功能,所以只要在用完后加上conn.Close();就可以了private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)  
    {  
       int idd=Convert.ToInt32(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString());  
    OleDbConnection condel = db.conn();  
    condel.Open();  
    OleDbCommand cmddel=new OleDbCommand("delete from news where ArticleID="+idd,condel);  
    cmddel.ExecuteNonQuery();  
    condel.Close();
    this.databind();  
    }  在此谢谢大家的帮助