动态生成的DataGrid,点击里面的删除按钮,从第二次开始,要每点两次,才能执行删除操作。
大家看这前,最好看一下问题的由来:
http://community.csdn.net/Expert/topic/3965/3965047.xml?temp=.2934076,
因为,如果不用动态生成DataGrid,这段代码很好写,也不会出现什么问题。public class WebForm30 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Panel Panel1;

private void Page_Load(object sender, System.EventArgs e)
{
this.CreateGrid(Panel1);
}


private void CreateGrid(Panel Panel1 )
{
DataGrid dg=new DataGrid();
ButtonColumn col=new ButtonColumn();
col.DataTextField="ISBN";
dg.ItemCommand+=new DataGridCommandEventHandler(dg_ItemCommand);
dg.Columns.Add(col);
dg.DataSource =this.GetDataSource();
dg.DataBind();
Panel1.Controls.Add(dg);
}
private DataSet GetDataSource()
{
string conn="server=(local);database=WroxBooks;uid=sa;pwd=;";
SqlDataAdapter da;
da=new SqlDataAdapter("select * from BookList",new SqlConnection(conn));
DataSet ds =new DataSet();
da.Fill(ds);
return ds;
}
private void dg_ItemCommand(object sender,DataGridCommandEventArgs e)
{
SqlConnection conn =new SqlConnection("server=(local);database=WroxBooks;uid=sa;pwd=123;");
SqlCommand com =new SqlCommand("delete from BookList where ISBN=@ISBN",conn);
com.Parameters.Add("@ISBN",((LinkButton)e.Item.Cells[0].Controls[0]).Text);
conn.Open();
com.ExecuteNonQuery();
conn.Close();
Panel Panel1;
Panel1=(Panel)e.Item.Page.FindControl("Panel1");
Panel1.Controls.Clear();
CreateGrid(Panel1);
}
}
主意:不能在页面的InitializeComponent()里对DataGrid声明,因为实际的情况是,我要生成若干个不同列数的DataGrid加到panel里面去。
因为各DataGrid的列数不尽相同,所以,对DataGrid的定义和数据绑定还要在一起。

解决方案 »

  1.   

    这位提问题的大哥,是不是在写科研系统啊?关于你的问题,我只能说,datagrid删除后,一定要再绑定才行。page每次load都要重新绑定。另外,你是不是可以用session啊!
      

  2.   

    我在删除后执行:
    Panel Panel1;
    Panel1=(Panel)e.Item.Page.FindControl("Panel1");
    Panel1.Controls.Clear();
    CreateGrid(Panel1);
    就是重新生成DataGrid并且重新绑定啊。各位如果有时间,可以亲自试一下这个例子。
      

  3.   

    晕...你每操作一次就
    private void CreateGrid(Panel Panel1 )
    {
    DataGrid dg=new DataGrid();
    ButtonColumn col=new ButtonColumn();
    col.DataTextField="ISBN";
    dg.ItemCommand+=new DataGridCommandEventHandler(dg_ItemCommand);
    dg.Columns.Add(col);
    dg.DataSource =this.GetDataSource();
    dg.DataBind();
    Panel1.Controls.Add(dg);
    }一次...你都建个新的...你...的资源不会耗尽啊
      

  4.   

    你的这个问题是这样造成的:你在第一次加载时在Page_Load中加载了一个DataGrid,而在你点点击删除时可以正常执行你的dg_ItemCommand,并且在删除之后重新加载了一个DataGrid,到这里你看到的还是正确的显示,但时接下来,你在点击删除下一个时,首先执行的是Page_Load中的新建一个DataGrid,那么你在客户端看到的DataGrid已经不在了,当然属于他的DataGridCommandEventHandler也不在了,自然不会执行dg_ItemCommand。
    解决的办法是你把DataGrid dg=new DataGrid();放在外面,应该可以解决这个问题!不过你的程序应该还会出现别的问题,我总觉得怪怪的,但是又说不明白,你自己试试看。
    public class WebForm30 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Panel Panel1;
                      DataGrid dg=new DataGrid();

    private void Page_Load(object sender, System.EventArgs e)
    {
    this.CreateGrid(Panel1);
    }
      

  5.   

    送你一篇文章,理解了就没有问题了
    http://www.microsoft.com/china/msdn/library/webservices/asp.net/dnasppDynamicUI.mspx 
      

  6.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    if (IsNotPostBack)
    {
    this.CreateGrid(Panel1);
    }
    }