winform 数据有关问题,无法对当前数据进行正常的编辑
winform 数据问题,无法对当前数据进行正常的编辑
正常情况如下图:

在正常情况下:
1、现金类型一列为下拉框形式,包括两个选择项来进行选择,解行金额和备注列都可编辑;
2、这三列是在DataGridView控件中的,能够进行插行删行,新行能够进行编辑。
如下图所示,现在遇到了下边的问题:
1、“现金类型”不是下拉框,而是边界状态,“解行金额”和备注都能正常编辑;
2、对该数据进行插行时,报错说“当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。”

我的一部分代码,为页面初始加载的,如下:
LondInfo(EditID);方法的代码如下:
现在没一点解决的思路,请教怎样解决这样的问题?求高手给我点解决的思路 ~~~~~
------解决思路----------------------
绑定数据源方式插行可以直接在数据源里插空行,然后重新刷新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
------解决思路----------------------
一切以方便为主,你的可以使用绑定,为何不用呢
------解决思路----------------------
直接给dt增加一行就好了啊,不要动数据库,也不要直接对控件进行操作,也不用重新绑定数据源,dt变了,控件绑定了dt,也就跟着变了
Datarow dr=dt.NewRow();
dt.Rows.Add(dr);
------解决思路----------------------
需要注意的是,dt是个引用类型
执行this.dgvDetail.DataSource = dt;之后,绑定的是它实际指向的表,而不是dt这个变量
因此dt如果重新执行了new操作,不会对控件造成影响(dt重新指向了新的对象,控件已经不绑定这个dt了)
正常情况如下图:
在正常情况下:
1、现金类型一列为下拉框形式,包括两个选择项来进行选择,解行金额和备注列都可编辑;
2、这三列是在DataGridView控件中的,能够进行插行删行,新行能够进行编辑。
如下图所示,现在遇到了下边的问题:
1、“现金类型”不是下拉框,而是边界状态,“解行金额”和备注都能正常编辑;
2、对该数据进行插行时,报错说“当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。”
我的一部分代码,为页面初始加载的,如下:
/// <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
------解决思路----------------------
一切以方便为主,你的可以使用绑定,为何不用呢
------解决思路----------------------
直接给dt增加一行就好了啊,不要动数据库,也不要直接对控件进行操作,也不用重新绑定数据源,dt变了,控件绑定了dt,也就跟着变了
Datarow dr=dt.NewRow();
dt.Rows.Add(dr);
------解决思路----------------------
需要注意的是,dt是个引用类型
执行this.dgvDetail.DataSource = dt;之后,绑定的是它实际指向的表,而不是dt这个变量
因此dt如果重新执行了new操作,不会对控件造成影响(dt重新指向了新的对象,控件已经不绑定这个dt了)