winform 数据有关问题,无法对当前数据进行正常的编辑

winform 数据问题,无法对当前数据进行正常的编辑
正常情况如下图:
winform 数据有关问题,无法对当前数据进行正常的编辑
在正常情况下:
     1、现金类型一列为下拉框形式,包括两个选择项来进行选择,解行金额和备注列都可编辑;
     2、这三列是在DataGridView控件中的,能够进行插行删行,新行能够进行编辑。


如下图所示,现在遇到了下边的问题:
1、“现金类型”不是下拉框,而是边界状态,“解行金额”和备注都能正常编辑;
2、对该数据进行插行时,报错说“当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。”
winform 数据有关问题,无法对当前数据进行正常的编辑


我的一部分代码,为页面初始加载的,如下:


 /// <summary>
        /// 进入页面,相关判断
        /// </summary>
        public void Status()
        {
            txtCashTransfer.TextChanged -= new EventHandler(txtCashTransfer_TextChanged);
            txtRemarks.TextChanged -= new EventHandler(txtCashTransfer_TextChanged);
            dgvDetail.CellEndEdit -= new DataGridViewCellEventHandler(dgvDetail_CellEndEdit);
            if (string.IsNullOrEmpty(EditID))
            {
                //新增数据状态下的代码,该部分正常
            }
            else
            {
                //功能按钮
                this.cboxBank.Enabled = false;
                this.txtCashTransfer.Enabled = false;
                this.txtOddNo.Enabled = false;
                this.txtRemarks.Enabled = false;
                this.comboBox1.Visible = false;

                dgvDetail.Rows.Add();
                //dgvDetail.Rows[0].Cells["Column1"].Value = "票款";
                this.dgvDetail.ReadOnly = false;
                this.dgvDetail.Columns["Column1"].ReadOnly = true;

                LondInfo(EditID);
            }
            txtCashTransfer.TextChanged += new EventHandler(txtCashTransfer_TextChanged);
            txtRemarks.TextChanged += new EventHandler(txtCashTransfer_TextChanged);
            dgvDetail.CellEndEdit += new DataGridViewCellEventHandler(dgvDetail_CellEndEdit);
            this.cboxBank.SelectedIndexChanged += new EventHandler(cboxBank_SelectedIndexChanged);
        }



 LondInfo(EditID);方法的代码如下:
    

/// <summary>
        /// 加载初始数据
        /// </summary>
        /// <param name="id"></param>
        public void LondInfo(string id)
        {
            if (id != "" && !string.IsNullOrEmpty(EditID))
            {
                Cash model = cbll.GetModel(Convert.ToInt32(id));       
                #region 新修改的数据
                if (model.documentStatus == ((int)TicketFareState.正常).ToString())
                {
                    this.cboxBank.Enabled = true;
                    this.txtRemarks.Enabled = true;
                    this.txtCashTransfer.Enabled = true;
                    //this.dgvDetail.ReadOnly= false;
                    this.dgvDetail.ReadOnly = false;
                    this.dgvDetail.Columns["Column1"].ReadOnly = false;
                    this.btnDelete.Enabled = true;
                    this.btnInsert.Enabled = true;
                    this.txtStatus.Text = TicketFareState.正常.ToString();   
                }
                #endregion
                this.txtOddNo.Text = model.oddNo;
                this.txtCashTransfer.Text = model.cashTransfer;
                this.txtRemarks.Text = model.remarks;
                this.cboxBank.SelectedValue = model.bank;

                DataTable dt = cbll.GetListDetail(id);
                this.dgvDetail.DataSource = dt;
                //this.dgvDetail.Enabled = false;
            }
        }



现在没一点解决的思路,请教怎样解决这样的问题?求高手给我点解决的思路 ~~~~~




------解决思路----------------------
绑定数据源方式插行可以直接在数据源里插空行,然后重新刷新dgvDetail,下拉框光看你代码无法确定什么问题
------解决思路----------------------
插行操作 就是在绑定数据源之前,更改数据源,用2L的方式试试。通过更改数据源再绑定到控件。
------解决思路----------------------
也不一定非要增加到数据库,增加到数据源dt就行了
用了dgvDetail.Rows.Add()的编程方式就不能同时用this.dgvDetail.DataSource = dt
------解决思路----------------------
foreach(DataRow item in dt.Rows)
{
        var index = this.dgvDetail.Rows.Add
                (
                    ++i,
                    dr[0],
                    dr[1],
                    .
                    .
                );
}

或者
var row = new DataGridViewRow();
row.SetValue()
this.dgvDetail.Rows.Add(row);
不过这种方式添加的是非共享行,当使用虚拟模式时,会影响性能,是不推荐的
http://msdn.microsoft.com/zh-cn/library/ha5xt0d9(v=vs.110).aspx
------解决思路----------------------
一切以方便为主,你的可以使用绑定,为何不用呢
------解决思路----------------------
引用:
Quote: 引用:

也不一定非要增加到数据库,增加到数据源dt就行了
用了dgvDetail.Rows.Add()的编程方式就不能同时用this.dgvDetail.DataSource = dt


那我不用this.dgvDetail.DataSource = dt;  怎样将数据加载到控件上去呢?

直接给dt增加一行就好了啊,不要动数据库,也不要直接对控件进行操作,也不用重新绑定数据源,dt变了,控件绑定了dt,也就跟着变了
Datarow dr=dt.NewRow();
dt.Rows.Add(dr);
------解决思路----------------------
需要注意的是,dt是个引用类型
执行this.dgvDetail.DataSource = dt;之后,绑定的是它实际指向的表,而不是dt这个变量
因此dt如果重新执行了new操作,不会对控件造成影响(dt重新指向了新的对象,控件已经不绑定这个dt了)