我的目的:通过传入数据库和表,把数据库中的表的数据显示在DataGrid上,并能直接在DataGrid 上进行增加,删除,修改操作!(假设数据库中只有一个单表)
下面是我自己编写的用户控件:不过有大问题,通过指定数据库和表后,只能在DataGrid上显示,不能进行增加,删除,修改操作。(个人感觉就是:增删修操作的SQL语句不好写)//WebForm1.aspx.cs的代码
//它使用后面的控件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;namespace webkj
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page 
{
protected WebUserControl1 ucBook ;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
ucBook.DBName = "bookdb";
ucBook.SQLCmd = "select * from book ";
ucBook.TabName = "book";
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.Load += new System.EventHandler(this.Page_Load); }
#endregion
}
}
//用户控件 WebUserControl1.ascx.cs 的代码
namespace webkj
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// WebUserControl1 的摘要说明。
/// </summary>
public abstract class WebUserControl1 : System.Web.UI.UserControl
{ public string  DBName;//数据库
public string  SQLCmd;//查询
public string  TabName;//表
//public string  key = null; protected System.Web.UI.WebControls.Label lblTitle;
public DataTable dt = null;
public DataSet ds = null;
public SqlDataAdapter myDataAdapter=null;
public SqlCommandBuilder objAutoGen = null;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
public bool shouldRebind = false; private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (Page != null)
{
string connstr = "Server=(local);Integrated Security=SSPI;database="+DBName;
ds = new DataSet();
SqlConnection conn = new SqlConnection(connstr);
myDataAdapter =new SqlDataAdapter(SQLCmd,conn); 
objAutoGen = new SqlCommandBuilder(myDataAdapter);
myDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myDataAdapter.Fill(ds,TabName); if (TabName != String.Empty)
dt = ds.Tables[TabName];
else
dt = ds.Tables[0]; } if (!Page.IsPostBack) 
{
shouldRebind = true;
BindDataGrid();
}
          //this.DataGrid1.DataKeyField = dt.Columns[0];

//this.TextBox1.Text = key.ToString();
} //绑定DataGrid
private void BindDataGrid()
{
if (shouldRebind) 
{
this.DataGrid1.DataSource = dt;
this.DataGrid1.DataBind();
}   
}                //保存操作
public void SaveData() 
{
myDataAdapter.Update(ds,TabName);

}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// 设计器支持所需的方法 - 不要使用
/// 代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DataGrid1.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_CancelCommand);
this.DataGrid1.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_EditCommand);
this.DataGrid1.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_DeleteCommand);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion                //DataGrid里用“属性生成器”建的 “编辑”按钮。
private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex =(int)e.Item.ItemIndex;
shouldRebind = true;
}                //DataGrid里用“属性生成器”建的 “取消”按钮。
private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = -1;
shouldRebind = true;
}
                
                //DataGrid里用“属性生成器”建的 “删除”按钮。  
private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
/*

// 删除引发命令的行
dt.Rows.RemoveAt(e.Item.DataSetIndex); // 保存更新的数据
Console.WriteLine("Delete: "+objAutoGen.GetDeleteCommand().CommandText);
SaveData(); this.DataGrid1.EditItemIndex = -1;
shouldRebind = true;

*/
//int number =(int)DataGrid1.DataKeys[e.Item.ItemIndex];
//string str= DataGrid1.DataKeyField ; //dt.Rows.RemoveAt((int)e.Item.DataSetIndex);
                        //怎么找到 关键字段 ->DataGrid里的关键值 -》执行SQL删除 string str = DataGrid1.DataKeys[(int)e.Item.ItemIndex].ToString();
string delCmd = "delete from "+TabName+"where"+key+"="+str;
string connstr = "Server=(local);Integrated 
Security=SSPI;database="+DBName;
//ds = new DataSet();
SqlConnection conn = new SqlConnection(connstr);
//myDataAdapter =new SqlDataAdapter(SQLCmd,conn); 
conn.Open();
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = delCmd;
sqlCmd.Connection = conn;
sqlCmd.ExecuteNonQuery(); /*
conn.Close();
SaveData();
DataGrid1.EditItemIndex = -1;
shouldRebind = true;  
*/
}
}
}

解决方案 »

  1.   

    给你一个绝对好用的。DateGrid的使用全了。private void Page_Load(object sender, System.EventArgs e)
    {
    first.Text="最首页";
    prev.Text="上一页";
    next.Text="下一页";
    last.Text="最后页";
    if(!IsPostBack)
    {
    BindGrid();
    }
    } #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.Page_Changed);
    this.DataGrid1.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_CancelCommand);
    this.DataGrid1.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_EditCommand);
    this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataGrid1_SortCommand);
    this.DataGrid1.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_UpdateCommand);
    this.DataGrid1.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_DeleteCommand);
    this.first.Click += new System.EventHandler(this.btnClick);
    this.prev.Click += new System.EventHandler(this.btnClick);
    this.next.Click += new System.EventHandler(this.btnClick);
    this.last.Click += new System.EventHandler(this.btnClick);
    this.go.Click += new System.EventHandler(this.goClick);
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion void Page_Changed(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
    {
    DataGrid1.CurrentPageIndex=e.NewPageIndex;
    BindGrid();   
    }
    void BindGrid()
    {

    DataGrid1.DataSource=opt.BindData("select * from Lines order by id","Lines");
    DataGrid1.DataBind();
    showstate();
    }
    void showstate()
    {
    DataTable dt=opt.BindData("select * from Lines order by id","Lines");
    int count=dt.Rows.Count;
    lblallcount.Text=count.ToString();
    lblpagecount.Text=DataGrid1.PageCount.ToString();
    lblcurrentindex.Text=(DataGrid1.CurrentPageIndex+1).ToString();
    }
    void btnClick(object sender,System.EventArgs e)
    {
    string arg=((LinkButton)sender).CommandArgument;
    switch(arg)
    {
    case ("first"):
    DataGrid1.CurrentPageIndex=0;
    break;
    case ("prev"):
    if(DataGrid1.CurrentPageIndex>0)
    DataGrid1.CurrentPageIndex--;
    break;
    case ("next"):
    if(DataGrid1.CurrentPageIndex<(DataGrid1.PageCount-1))
    DataGrid1.CurrentPageIndex++;
    break;
    case ("last"):
    DataGrid1.CurrentPageIndex=DataGrid1.PageCount-1;
    break;
    default:
    DataGrid1.CurrentPageIndex=Convert.ToInt32(arg);
    break;
    }
    BindGrid();
    }
    private void goClick(object sender, System.EventArgs e)
    {
    if(to.Text.Trim()!="")
    {
    int index=Int32.Parse(to.Text.Trim())-1;
    if(index>=0&&index<DataGrid1.PageCount)
    {
    DataGrid1.CurrentPageIndex=index;
    }
    }
    BindGrid();
    } private void Button1_Click(object sender, System.EventArgs e)
    {
    this.Response.Write("<script language=\"javascript\">window.open(\"LineAddL.aspx\", \"\" , \"toolbar=no , location=no , directories=no , status=no , menubar=no , scrollbars=no , resizeable=no , width=250 , height=70 , top=10 , left=10\");</script>"); } private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    DataGrid1.EditItemIndex=e.Item.ItemIndex;
    BindGrid();
    } private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    DataGrid1.EditItemIndex=-1;
    BindGrid();
    } private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    DataGrid1.EditItemIndex=-1;
    int ID = int.Parse(DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
    opt.Operatedata("delete from Lines where ID=" + ID);
    BindGrid(); } private void DataGrid1_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
    {
    string SortField = (string)e.SortExpression;
    BindGrid();
    } private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    try
    {
    string Line = "";
    string Istemp = "";
    int ID = 0;
    if(Page.IsValid)
    {
    ID = int.Parse(DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
    Line = ((System.Web.UI.WebControls.TextBox)e.Item.Cells[1].Controls[0]).Text;
    Istemp = ((System.Web.UI.WebControls.TextBox)e.Item.Cells[2].Controls[0]).Text;


    opt.Operatedata("update Lines set Line='"+ Line + "',Istemp='"+Istemp+"' where ID=" + ID); DataGrid1.EditItemIndex = -1;
    BindGrid();
    }
    catch(Exception UPC)
    {
    Response.Write(UPC.ToString());
    }
    }
      

  2.   

    1.你少一个事件this.DataGrid1.UpdateCommand += new 
    System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_UpdateCommand);//更新事件要在这里写,比如
    private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    try
    {
    string Line = "";
    string Istemp = "";
    int ID = 0;
    if(Page.IsValid)
    {
    ID = int.Parse(DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
    Line = ((System.Web.UI.WebControls.TextBox)e.Item.Cells[1].Controls[0]).Text;
    Istemp = ((System.Web.UI.WebControls.TextBox)e.Item.Cells[2].Controls[0]).Text;

    opt.Operatedata("update Lines set Line='"+ Line + "',Istemp='"+Istemp+"' where ID=" + ID);
    DataGrid1.EditItemIndex = -1;
    BindGrid();
    }
    catch(Exception UPC)
    {
    Response.Write(UPC.ToString());
    }
    }
    2.删除语句似乎没什么不对之处
      

  3.   

    如果删除出错,可能是你没有设置datakeyfield,
    比如
    <asp:datagrid id="UserManage" runat="server" AutoGenerateColumns="False"
         OnCancelCommand="UserManage_CancelCommand" 
         OnEditCommand="UserManage_EditCommand" 
         OnUpdateCommand = "UserManage_UpdateCommand"
    DataKeyField="UserID">//在这里设置datagrid的唯一字段,估计就可以删除了,试试