代码如下: 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会执行两遍,数据会插入两次。找了一天没找出原因,救命啊!!!
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会执行两遍,数据会插入两次。找了一天没找出原因,救命啊!!!
你可以这样试试:
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();
}
窗体设计器生成的代码 这块 是否有 对 datagrid的itemcommand的定义 ----两个地方不要同时定义 否则会执行两便
???这可能是因为更新后的BindQuality()方法已触发了ItemCommand 事件。
如果这样的话,那么ItemCommand事件不是一个loop了吗
this.datagrade1.DataBind(); 会触发itemcommand就像ListView.SelectedIndexChanged事件,当lvw.Items.Clear();时也会被触发.
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的话,
else %%%
i++;