代码如下: private DataSet ds_temp;
private SqlDataAdapter da_temp;
private SqlConnection conn;
private System.Data.DataTable dt_temp;
override protected void Page_Load(object sender, System.EventArgs e)
{
ds_temp=new DataSet();
TSoftBasicService.TSoftBasicService ts = new TSoftSample.TSoftBasicService.TSoftBasicService();
string strSql = ts.GetConStr();//得到数据连接语句
conn = new SqlConnection(strSql);
da_temp = new SqlDataAdapter("Select * from T_PickQuality",conn);
da_temp.Fill(ds_temp,"T_PickQuality");
dt_temp = ds_temp.Tables["T_PickQuality"];
dt_temp.PrimaryKey = new DataColumn[] {dt_temp.Columns[0]};

try 
{
if (!Page.IsPostBack)
{
base.Page_Load(sender,e);
BindQuality();
} }
catch (System.Exception eLoad) 
{
this.Response.Write(eLoad.Message);
}
} private void fSetDBPanel()
{
//**********装载用户控件
System.Web.UI.Control C1=LoadControl("../Control/WUC_DBPanel.ascx");
//**********添加DataGrid的事件
((WUC_DBPanel)C1).fCurName="_一次投料主表";
((WUC_DBPanel)C1).fSetFocus="TB_V_Batch";
((WUC_DBPanel)C1).fTableName="T_PickFirstThrow";
((WUC_DBPanel)C1).fIDValue=Page.Request.QueryString["FindValue"].ToString();
((WUC_DBPanel)C1).fQueryName="Select * from T_PickFirstThrow Where FID=";
TDC1.Controls.Add(C1);
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
fSetDBPanel();
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.datagrade1.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.datagrade1_ItemCommand);
this.datagrade1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.datagrade1_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void BindQuality()//绑定质检数据
{
this.datagrade1.DataSource=dt_temp; 
this.datagrade1.DataBind(); 
}
public void datagrade1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if (e.CommandName == "Add")//“%%%”
{
try 
{
//---------------------------插入新行---------------------------------------------
object[] Quality = {System.Guid.NewGuid().ToString(),"",0,TB_FID.Text};
Quality[1] = ((TextBox)e.Item.FindControl("NewGrade")).Text;
Quality[2] = Convert.ToDecimal(((TextBox)e.Item.FindControl("NewPercent")).Text);
dt_temp.Rows.Add(Quality);
if (Quality[1].ToString() !="")
{
da_temp.InsertCommand = new SqlCommand("insert T_PickQuality values (@FID,@Grade,@Percent,@FSubID)",conn);

SqlParameter parm1 = new SqlParameter("@FID",SqlDbType.VarChar,50,"FID");
parm1.Value = System.Guid.NewGuid().ToString();//((TextBox)e.Item.FindControl("NewFMainID")).Text;
da_temp.InsertCommand.Parameters.Add(parm1);

SqlParameter parm2 = new SqlParameter("@Grade",SqlDbType.VarChar,20,"V_Grade");
parm2.Value = ((TextBox)e.Item.FindControl("NewGrade")).Text;
da_temp.InsertCommand.Parameters.Add(parm2);

SqlParameter parm3 = new SqlParameter("@Percent",SqlDbType.Decimal,12,"N_Percent");
parm3.Value = ((TextBox)e.Item.FindControl("NewPercent")).Text;
da_temp.InsertCommand.Parameters.Add(parm3);

SqlParameter parm4 = new SqlParameter("@FSubID",SqlDbType.VarChar,50,"FSubID");
parm4.Value = TB_FID.Text;
da_temp.InsertCommand.Parameters.Add(parm4);
}
//-------------------------------------------------------------------------------------


}
catch(Exception ex)
{
//Response.Write(ex.Message);
this.Alert(ex.Message);
}
}
da_temp.Update (ds_temp,"T_PickQuality"); 
            BindQuality();//“###”
}问题:在执行完“###”处后,程序又跳转到“%%%”,也就是ItemCommand会执行两遍,数据会插入两次。找了一天没找出原因,救命啊!!!

解决方案 »

  1.   

    这可能是因为更新后的BindQuality()方法已触发了ItemCommand 事件。
    你可以这样试试:
    private bool IsUpdating = false;private void BeginUpdate()
    {
      //正在更新...
      IsUpdating = true;
    }private void EndUpdate()
    {
      //已更新
      IsUpdating = false;
    }ItemCommand 事件:
    if (e.CommandName == "Add")//“%%%”
    {
     if (this.IsUpdating == true) continue;//不执行
     //........省略代码 this.BeginUpdate() da_temp.Update (ds_temp,"T_PickQuality"); 
     BindQuality();//“###”这个方法可能再次执行此事件的原因所在 this.EndUpdate();
    }
      

  2.   

    看看 aspx 文件里面的datagrid的申明 是否有 对 itemcommand的申明 然后看  .aspx.cs文件里面的
    窗体设计器生成的代码 这块 是否有 对 datagrid的itemcommand的定义  ----两个地方不要同时定义 否则会执行两便
      

  3.   

    永不言弃所言:
    ???这可能是因为更新后的BindQuality()方法已触发了ItemCommand 事件。
    如果这样的话,那么ItemCommand事件不是一个loop了吗
      

  4.   

    this.datagrade1.DataBind(); 会触发itemcommand
      

  5.   

    把你的前台DataGrid的代码也贴一下吧
      

  6.   

    如 lovefootball(蟑螂) 所说:
    this.datagrade1.DataBind(); 会触发itemcommand就像ListView.SelectedIndexChanged事件,当lvw.Items.Clear();时也会被触发.
      

  7.   

    #region 数据绑定
    private void BindData()
    {
    string strSql="select id,subject,name,"+ 
    "from test_tmp";
    testDg.DataSource=SqlHelper.ExecuteDataset(Conn,CommandType.Text,strSql);
    testDg.DataBind();
    Conn.Close();
    }
    #endregionprivate void testDg_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if (e.CommandName == "test")
    {
    Response.Write("1\n");
    BindData();
    }
                      }
    这是我测试的代码,ItemCommand执行一次
    如果说 this.datagrade1.DataBind(); 会触发itemcommand的话,
      

  8.   

    是有两次,用IsPostBack判断一下如何?
      

  9.   

    问题自己解决了,在页面文件HTML中又触发了一次itemcommand----多了个OnItemCommand属性。
      

  10.   

    用一句话来解决,设一static int i=0;if(i%4<2)###
    else %%%
    i++;