DataGridView 绑定的数据源是 mDetailTable,
在DataGridView 中单击"品名"一列时,
先 mDetailTable.NewRow() 得到一个新的row,然后将这个row传给弹出窗口,
由弹出窗口编辑内容后返回这个row,让mDetailTable.Rows.Add(row)添加数据,
然后DataGridView 刷新 dgvEdit.Refresh(),现在的问题是添加一行记录后,DataGridView后面会出来两个空行,
按我的想法,最多应该是一个用来新增的空行啊,这个是什么问题,怎么解决啊?DataGridView 的EditMode 是 EditProgrammaticallyCSDN不能帖图,我画个样子,大家帮我看看
┏┳━━┳━━┳━━┳━━┓
┃┃品名┃型号┃单位┃数量┃ //列头
┣╋━━╋━━╋━━╋━━┫
┃┃001 ┃S001┃ 个 ┃1000┃
┣╋━━╋━━╋━━╋━━┫
┃┃  ┃  ┃  ┃  ┃ //空行一,添加后,焦点会自动到这一行第一列
┣╋━━╋━━╋━━╋━━┫
┃┃  ┃  ┃  ┃  ┃ //空行二,不知道为什么会出来?
┗┻━━┻━━┻━━┻━━┛        //连接数据源
        private void InitData()
        {
            dgvEdit.DataSource = mDetailTable;
        }
        
        //在品名一列单击时,弹出一个窗口编辑数据
        private void dgvEdit_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvEdit.Columns[e.ColumnIndex].Name == "品名")
            {
                FormOrderDetailInput frmInput = new FormOrderDetailInput();
                DataRow row;
                if (e.RowIndex >= mDetailTable.Rows.Count)
                {
                    row = mDetailTable.NewRow();
                }
                else
                {
                    row = mDetailTable.Rows[e.RowIndex];
                }
                frmInput.EditOrderDetail(row);
                if (frmInput.DialogResult == DialogResult.OK)
                {
                    if (e.RowIndex >= mDetailTable.Rows.Count)
                    {
                        mDetailTable.Rows.Add(row);
                        //dgvEdit.CancelEdit(); 添加后用取消编辑也没用
                        //dgvEdit.EndEdit(); 添加后提交也没用
                    }
                    dgvEdit.Refresh();
                }
            }
        }

解决方案 »

  1.   

    try...            this.dataGridView1.AllowUserToAddRows = false;加上这句就不会多出来一行了..
      

  2.   

    其实你直接对DataGridView进行编辑不好吗?为什么还做得那么复杂,先通过单击列名,再弹一个对话框,再....
      

  3.   

    你在绑定数据前就设置一下这个就行了..this.dataGridView1.AllowUserToAddRows = false;或者直接在界面,将DataGridView的这个属性设为false即可..
      

  4.   

    for example: private DataSet ds = new DataSet();
            private void button1_Click(object sender, EventArgs e)
            {
                //增加一条数据
                DataRow newRow = ds.Tables["student"].NewRow();
                newRow["sno"] = "111";
                newRow["sname"] = "bbb";
                newRow["sage"] = 23;
                ds.Tables["student"].Rows.Add(newRow);
                this.dataGridView1.Refresh();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                DataBind();
            }
            //数据绑定
            private void DataBind()
            {
                SqlConnection con = new SqlConnection("server=.;database=student;uid=sa;pwd=0421");
                SqlDataAdapter sda = new SqlDataAdapter("select * from studentDetails", con);
                sda.Fill(ds, "student");
                //绑定之前设置
                this.dataGridView1.AllowUserToAddRows = false;
                this.dataGridView1.DataSource = ds.Tables["student"];
            }
      

  5.   

    谢谢大家,问题终于解决了
    因为我要新增数据,又不想再加按钮作新增记录,所以 dataGridView.AllowUserToAddRows一直高为True,这样在记录集为空时,可以单击空行增加记录。对于liuja_0421说得,为什么不直接通过 DataGridView 编辑,因为我对C#还不是很了解,这个DataGridView用得还不是很熟,二是因为很多地方都说编辑绑定的DataGridView最好直接编辑数据源,这样DataGridView就可以直接更新,所以我也想这么做,究竟那种方法好,我也不敢说,三是因为这个DataTable其实会连接几个子表,其中的项目不过用ID来关联的,这个我知道用 DataGridViewComboBoxColumn 可以实现,但是这样好像就把这一列绑定到了基本项目表了,比如说单位,字段多了,每个都要定义一个 DataGridViewComboBoxColumn 好麻烦,不如直接在另一个窗体上面放一个 ComboBox,读写也方便,反正是我还太菜了。好了,言归正传,把解决的方法说一下,经过楼上的提醒,虽然绑定的时候不能设置 DataGridView.AllowUserToAddRows=false;那我就在新增数据的地方加了这句,数据刷新后再把DataGridView.AllowUserToAddRows=true;设置回来就OK了                    DataGridView.AllowUserToAddRows=false;
                        if (e.RowIndex >= mDetailTable.Rows.Count)
                        {
                            mDetailTable.Rows.Add(row);
                            
                            //dgvEdit.CancelEdit(); 添加后用取消编辑也没用
                            //dgvEdit.EndEdit(); 添加后提交也没用
                        }
                        dgvEdit.Refresh();
                        DataGridView.AllowUserToAddRows=true;