我在DataGrid中的指定位置插入了一行,它在指定的位置插入了一后.但是这行的东西修改后就跑到最后去了.在插入位置是空行. 再次插入一行,刚才跑到后面的那行又跑回来了.
代码如下.
DataRow newrow = DT.NewRow();
newrow["isTotal"] = false;
DT.Rows.InsertAt(newrow,this.dataGrid1.CurrentCell.RowNumber);
DT.AcceptChanges();
this.dataGrid1.Refresh(); 

解决方案 »

  1.   

    这种情况是你做DT.AcceptChanges();后出现的.
    看看现在DataGrid是在按照什么排序.
    另外看看DataSet中有没有自动递增的字段.
      

  2.   

    哦!我不这样认为哈!我专门写了个测试程序,我把它贴出来吧!运行时在表格中右键插入一行.
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;namespace insertRow
    {
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    private System.Windows.Forms.DataGrid dataGrid1;
    private System.Windows.Forms.ContextMenu contextMenu1;
    private DataView dv;
    private DataTable DT;
    private System.Windows.Forms.MenuItem menuItem1;
            private MenuStrip menuStrip1;
            private ToolStripMenuItem 文件ToolStripMenuItem;
            private ToolStripMenuItem 新建ToolStripMenuItem;
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public Form1()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent();
    DT = new DataTable();
    this.DT = this.GetDataSource(ref DT,true,50,7);

    //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null) 
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
                this.dataGrid1 = new System.Windows.Forms.DataGrid();
                this.contextMenu1 = new System.Windows.Forms.ContextMenu();
                this.menuItem1 = new System.Windows.Forms.MenuItem();
                this.menuStrip1 = new System.Windows.Forms.MenuStrip();
                this.文件ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
                this.新建ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
                ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
                this.menuStrip1.SuspendLayout();
                this.SuspendLayout();
                // 
                // dataGrid1
                // 
                this.dataGrid1.ContextMenu = this.contextMenu1;
                this.dataGrid1.DataMember = "";
                this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
                this.dataGrid1.Location = new System.Drawing.Point(24, 32);
                this.dataGrid1.Name = "dataGrid1";
                this.dataGrid1.Size = new System.Drawing.Size(712, 480);
                this.dataGrid1.TabIndex = 0;
                // 
                // contextMenu1
                // 
                this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                this.menuItem1});
                // 
                // menuItem1
                // 
                this.menuItem1.Index = 0;
                this.menuItem1.Text = "插入一行";
                this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);
                // 
                // menuStrip1
                // 
                this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                this.文件ToolStripMenuItem});
                this.menuStrip1.Location = new System.Drawing.Point(0, 0);
                this.menuStrip1.Name = "menuStrip1";
                this.menuStrip1.Size = new System.Drawing.Size(760, 24);
                this.menuStrip1.TabIndex = 1;
                this.menuStrip1.Text = "menuStrip1";
                // 
                // 文件ToolStripMenuItem
                // 
                this.文件ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
                this.新建ToolStripMenuItem});
                this.文件ToolStripMenuItem.Name = "文件ToolStripMenuItem";
                this.文件ToolStripMenuItem.Text = "文件";
                // 
                // 新建ToolStripMenuItem
                // 
                this.新建ToolStripMenuItem.Name = "新建ToolStripMenuItem";
                this.新建ToolStripMenuItem.Text = "新建";
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
                this.ClientSize = new System.Drawing.Size(760, 533);
                this.Controls.Add(this.dataGrid1);
                this.Controls.Add(this.menuStrip1);
                this.MainMenuStrip = this.menuStrip1;
                this.Name = "Form1";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
                ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
                this.menuStrip1.ResumeLayout(false);
                this.ResumeLayout(false);
                this.PerformLayout(); }
    #endregion /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    }
    private void menuItem1_Click_1(object sender, System.EventArgs e)
    {

    }
    private DataTable GetDataSource(ref DataTable dt,bool newColumn,int rows,int cols)
    {
    //增加新列
    if(newColumn)
    {
    dt.Columns.Add("jsbw",    typeof(System.String));       //0
    dt.Columns.Add("qdh",     typeof(System.String));       //1 
    dt.Columns.Add("qdmc",    typeof(System.String));       //2
    dt.Columns.Add("dw",      typeof(System.String));       //3
    dt.Columns.Add("jss",     typeof(System.String));       //4
    dt.Columns.Add("gcl",     typeof(System.Double));       //5
    dt.Columns.Add("bz",      typeof(System.String));       //6
    dt.Columns.Add("isTotal", typeof(System.Boolean));      //7
    }
    //增加行
    dt.BeginLoadData();
    for (int intRowIndex=0;intRowIndex<rows;intRowIndex++)
    {
    DataRow newRow = dt.NewRow();
    newRow["isTotal"] = false;
    // newRow1["isTotal"]  = true;
    dt.Rows.Add(newRow);
    }
    dt.EndLoadData();
    return dt;
    } private void Form1_Load(object sender, System.EventArgs e)
    {
    dv = new DataView(DT);
    dv.AllowNew = false;
    dv.RowFilter = "isTotal=false";
    this.dataGrid1.DataSource = dv; } private void menuItem1_Click(object sender, System.EventArgs e)
    {
    DataRow newrow = DT.NewRow();
    newrow["isTotal"] = false;
    DT.Rows.InsertAt(newrow,this.dataGrid1.CurrentCell.RowNumber);
    DT.AcceptChanges();
    this.dataGrid1.Refresh();
    }
    }
    }
      

  3.   

    你调试一下,看看this.dataGrid1.CurrentCell.RowNumber是多少
      

  4.   

    #region Misc 
    /// <summary>
    /// bind misc datagrid
    /// </summary>
    private void BindData_pnlMisc()
    {
    try
    {
    ComLogOutput.WriteLogFile("BindData_pnlMisc Begin");

    // get tirp misc expenses
    DataSet dsExc = new TripReportDB().GetTripMisc(is_serial.Value,gs_cmpy.Value); Session["dsp_TripReport_Misc"] = dsExc.Tables[0];
    dg_Misc.DataSource = dsExc.Tables[0];
    dg_Misc.DataBind();

    // calculate total misc amt 
    MiscAmtChanged(new object(),new EventArgs());

    if(dsExc.Tables[0].Rows.Count>0)
    {
    txt_Misc_Re.Text = dsExc.Tables[0].Rows[0]["REMARK"].ToString();
    } ComLogOutput.WriteLogFile("BindData_pnlMisc end");

    }
    catch(Exception ex)
    {
    ComLogOutput.WriteLogFile(ex);

    lbl_Err.Text = ex.Message;
    }
    }
    /// <summary>
    /// Misc Insert button Click
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_Misc_Insert_Click(object sender, System.EventArgs e)
    {
    try
    {
    ComLogOutput.WriteLogFile("btn_Misc_Insert_Click Begin");

    if(this.Session["dsp_TripReport_Misc"]==null)
    {
    BindData_pnlMisc();
    } DataTable dtSource = (DataTable)Session["dsp_TripReport_Misc"] ;

    for( int i = 0 ; i < this.dg_Misc.Items.Count ; i ++ )
    {
    // get update value
    TextBox txtCity = (TextBox)dg_Misc.Items[i].FindControl("dg_Misc_txt_Country");
    DropDownList ucCurr = (DropDownList)dg_Misc.Items[i].FindControl("dg_Misc_Curr");
    string TripDate = ((UC_CalendarText)this.dg_Misc.Items[i].FindControl("dg_Misc_txt_TripDate")).Text.Trim();
    string  Particular = ((TextBox)this.dg_Misc.Items[i].FindControl("dg_Misc_txt_Particular")).Text.Trim();
    string  Purpose = ((TextBox)this.dg_Misc.Items[i].FindControl("dg_Misc_txt_Purpose")).Text.Trim();
    string  Amt = ((TextBox)this.dg_Misc.Items[i].FindControl("dg_Misc_txt_Amt")).Text.Trim();
    string  LocalAmt = ((TextBox)this.dg_Misc.Items[i].FindControl("dg_Misc_txt_LocalAmt")).Text.Trim();
    string  Receipt = ((TextBox)this.dg_Misc.Items[i].FindControl("dg_Misc_txt_Receipt")).Text.Trim();

    if(ComStyleCheck.CheckDateStyle(TripDate))
    {
    dtSource.Rows[i]["TRIP_DATE"] = TripDate ;
    } if( ComStyleCheck.CheckRequired(Amt) && ComStyleCheck.IsDecimail(Amt))
    {
    dtSource.Rows[i]["AMT"] = Amt;
    }
    if( ComStyleCheck.CheckRequired(LocalAmt) && ComStyleCheck.IsDecimail(LocalAmt))
    {
    dtSource.Rows[i]["LOCAL_AMT"] = LocalAmt;
    } dtSource.Rows[i]["PARTICULAR"] = Particular;
    dtSource.Rows[i]["PURPOSE"] = Purpose;
    dtSource.Rows[i]["ATTACHMENT"] = Receipt;
    dtSource.Rows[i]["CURR"] = ucCurr.SelectedItem.Value;
    dtSource.Rows[i]["COUNTRY"] = txtCity.Text;
    } // add new row
    DataRow dr = dtSource.NewRow();
    if(dtSource.Rows.Count>0)
    {
    string lastDate  = dtSource.Rows[dtSource.Rows.Count-1]["TRIP_DATE"].ToString();
    if( ComStyleCheck.CheckDateStyle(lastDate))
    {
    dr["TRIP_DATE"] = DateTime.Parse(lastDate).AddDays(1).ToString("dd/MM/yyyy");
    }
    else
    {
    dr["TRIP_DATE"] = DateTime.Parse(gd_start.Value).ToString("dd/MM/yyyy");
    }
    }
    else
    {
    dr["TRIP_DATE"] = DateTime.Parse(gd_start.Value).ToString("dd/MM/yyyy");
    } dr["ATTACHMENT"] = "D-";
    dtSource.Rows.Add(dr);

    dg_Misc.DataSource = dtSource;
    dg_Misc.DataBind(); ComLogOutput.WriteLogFile("btn_Misc_Insert_Click end");
    }
    catch(Exception ex)
    {
    ComLogOutput.WriteLogFile(ex);

    lbl_Err.Text = ex.Message;
    }
    }
    /// Misc Save button Click
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private bool btn_Misc_Save_Click()
    {
    try
    {
    ComLogOutput.WriteLogFile("btn_Misc_Save_Click Begin");

    MiscAmtChanged(new object(),new EventArgs());
    bool flag = true;
    //Creat a new datatable
    DataTable dtUpt = null;

    if(this.Session["dsp_TripReport_Misc"]==null)
    {
    BindData_pnlMisc();
    } //Copy the construct of the dataset
    DataTable dtOri = (DataTable)this.Session["dsp_TripReport_Misc"];
    dtUpt= dtOri.Copy(); for(int intDs = 0; intDs < dg_Misc.Items.Count;intDs++)
    {
    // get datagrid object
    DropDownList ucCurr = (DropDownList)dg_Misc.Items[intDs].FindControl("dg_Misc_Curr");
    TextBox txtCity = (TextBox)dg_Misc.Items[intDs].FindControl("dg_Misc_txt_Country"); UC_CalendarText TripDate = ((UC_CalendarText)this.dg_Misc.Items[intDs].FindControl("dg_Misc_txt_TripDate"));
    TextBox  Particular = ((TextBox)this.dg_Misc.Items[intDs].FindControl("dg_Misc_txt_Particular"));
    TextBox  Purpose = ((TextBox)this.dg_Misc.Items[intDs].FindControl("dg_Misc_txt_Purpose"));
    TextBox  Amt = ((TextBox)this.dg_Misc.Items[intDs].FindControl("dg_Misc_txt_Amt"));
    TextBox  LocalAmt = ((TextBox)this.dg_Misc.Items[intDs].FindControl("dg_Misc_txt_LocalAmt"));
    TextBox  Receipt = ((TextBox)this.dg_Misc.Items[intDs].FindControl("dg_Misc_txt_Receipt"));

    dtUpt.Rows[intDs]["CURR"] = ucCurr.SelectedItem.Value; if(!ComStyleCheck.CheckRequired(TripDate.Text) || !ComStyleCheck.CheckDateStyle(TripDate.Text)  )
    {
    TripDate.SetError = true;
    flag = false;
    }
    else
    {
    TripDate.SetError = false;
    dtUpt.Rows[intDs]["TRIP_DATE"] = TripDate.Text.Trim() ;
    } if(Receipt.Text.Trim().Replace("-","").Length > 5)
    {
    Receipt.BackColor = Color.Red;
    flag = false;
    }
    else
    {
    Receipt.BackColor = Color.White;
    dtUpt.Rows[intDs]["ATTACHMENT"] = Receipt.Text.Trim().Replace("-","");
    }

    dtUpt.Rows[intDs]["COUNTRY"] = txtCity.Text.Trim(); dtUpt.Rows[intDs]["PARTICULAR"] = Particular.Text.Trim(); dtUpt.Rows[intDs]["PURPOSE"] = Purpose.Text.Trim(); if(ComStyleCheck.CheckRequired(Amt.Text.Trim()) && !ComStyleCheck.CheckMoneyValue(Amt.Text.Trim(),6,2)  )
    {
    Amt.BackColor = Color.Red;
    flag = false;
    }
    else
    {
    Amt.BackColor = Color.White;
    if(Amt.Text.Trim()!="")
    {
    dtUpt.Rows[intDs]["AMT"] = Amt.Text.Trim();
    }
    } if(ComStyleCheck.CheckRequired(LocalAmt.Text.Trim()) && !ComStyleCheck.CheckMoneyValue(LocalAmt.Text.Trim(),6,2)  )
    {
    LocalAmt.BackColor = Color.Red;
    flag = false;
    }
    else
    {
    LocalAmt.BackColor = Color.FromArgb(217,217,217);
    if(LocalAmt.Text.Trim()!="")
    {
    dtUpt.Rows[intDs]["LOCAL_AMT"] = LocalAmt.Text.Trim();
    }
    }
    }

    if(flag == false)
    {
    //lbl_Err.Text = "you must input correct info !";
    lbl_Err.Text =ComLocalDiff.GetMessageById("1126",UserInfo.LangCode);
    return false;
    }
    // update misc to DB
    new TripReportDB().UpdateMisc(gs_cmpy.Value,is_serial.Value,UserInfo.UID,dtUpt); new TripReportDB().UpdateRe(gs_cmpy.Value,is_serial.Value,UserInfo.UID,"6",txt_Misc_Re.Text); BindData_pnlMisc(); ComLogOutput.WriteLogFile("btn_Misc_Save_Click end"); return true;
    }
    catch(Exception ex)
    {
    ComLogOutput.WriteLogFile(ex);

    lbl_Err.Text = ex.Message;
    return false;
    }
    }
      

  5.   

    这种情况是你做DT.AcceptChanges();后出现的.
    看看现在DataGrid是在按照什么排序.
    另外看看DataSet中有没有自动递增的字段.
      

  6.   

    这么多代码,眼花了,不看了。既然别人说是DT.AcceptChanges();的问题,你就把它去掉试试啦。不过,我不知道你为什么要DT.AcceptChanges();