在datagridview中编辑文本框
Posted
技术标签:
【中文标题】在datagridview中编辑文本框【英文标题】:Editing textbox inside datagridview 【发布时间】:2020-01-10 12:28:40 【问题描述】:我的项目是带有实体框架的 c# windows 窗体,并且我有带有 TextColumn 的 DataGridView。我想编辑最后一列 TextColumn Cells[3]。 将所有值从数据库获取到 GridView 是没有问题的。我明白了。 而且我可以输入一个新值,但是只要我点击那个地方,它就会变成旧值。文本框没有保留我要编辑的新值。 对于第 3 列中的此单元格,ReadOnly 为 false,因为我可以写入但将新值更改回旧值。 我错过了什么样的事件,我该如何解决这个问题?从某些方面来说,Gridview 的洞似乎被锁定了。请帮忙。
我什至尝试过:
foreach (DataGridViewRow row in dgvOrder.Rows)
row.Cells[3].ReadOnly = false;
下面是我的代码。
private void Treatments_Load(object sender, EventArgs e)
try
using (MyHealthEntities db = new MyHealthEntities())
var orderd = db.Order.Where(x => x.Ordernr == OrNr).FirstOrDefault();
if(orderd != null)
var myOrder = (from u in db.....
join d in ...
join m in ...
where u.....
select new
OrderId = m.MedId,
Name = m. Name,
Quality = m.Quality,
Description = d.Description
).ToList();
if (myOrder != null)
dgvOrder.DataSource = myOrder ;
foreach (DataGridViewRow row in dgvOrder.Rows)
row.Cells[3].ReadOnly = false;
catch (Exception ex)
MessageBox.Show(ex.Message);
【问题讨论】:
我不太了解 Entity,但也许 this answer 展示如何使用 Entity 绑定到 datagridview 会有所帮助?它需要是一个 BindingList 而不仅仅是一个 List,但答案表明当您绑定到网格时它会自动转换为一个。 【参考方案1】:如果我没记错的话,普通的 System.Collections.Generic.List 在直接绑定时不支持编辑,因为它没有实现双向数据绑定的 IBindingList(或必要的 ListChanged 事件)。您可能需要将 List 包装到 BindingList 中才能编辑值。这对于匿名类型是不可能的。
首先,创建一个类来存储您的列表项:
public Class Order
public int OrderID get; set;
public string Name get; set;
public byte Quality get; set;
public string Description get; set;
然后在您的查询中,
select new Order
OrderId = m.MedId,
Name = m. Name,
Quality = m.Quality,
Description = d.Description
现在将其移至 BindingList:
if (myOrder != null)
BindingList<Order> myBindingList = New BindingList<Order>(myOrder);
dgvOrder.DataSource = myBindingList;
我还建议将 BindingList 包装在 BindingSource 中,这样您就不必手动处理添加/删除的行:
if (myOrder != null)
BindingList<Order> myBindingList = New BindingList<Order>(myOrder);
BindingSource myBindingSource = New BindingSource(myBindingList);
dgvOrder.DataSource = myBindingSource;
抱歉,如果我的语法有点不对劲,我最近大部分时间都在使用 vb。
编辑:我错过了 BindingList 没有实现 IContainer,因此上面用于绑定到 BindingSource 的代码将不起作用,因为 BindingSource 的单参数构造函数专门采用 IContainer。 如果您仍然想要要使用 BindingSource,应该使用 BindingSource 的第三个构造函数,如下所示:
BindingSource myBindingSource = New BindingSource(myBindingList, Nothing);
BindingSource 接受绑定到 IBindingList,但只能使用此构造函数或在使用无参数构造函数后直接设置 .DataSource 属性。 留下上面的错误代码,以便阅读 OP 评论的其他人了解所引用的内容。
【讨论】:
太棒了。它在没有 BindingSourse 的情况下工作。如果我使用 BindingSourse,则会收到此错误“无法从 'System.ComponentModel.BindingList当您使用“dgvOrder.DataSource = myOrder”时,您无法编辑 DataGrid 条目。
我的建议是你在你的 myOrder 列表中“为每个”做,然后逐行添加到网格中。之后,您可以执行另一个“for each”,从 DataGrid 中恢复数据并将这些数据保存在您的 db.Order 中。
【讨论】:
以上是关于在datagridview中编辑文本框的主要内容,如果未能解决你的问题,请参考以下文章
winform中。datagridview 选中某行 然后点击编辑。编辑的时候单元格变成文本框。
DataGridView使用技巧十一:DataGridView用户输入时,单元格输入值的设定
如何在不使用 datagridview 的情况下编辑绑定到组合框的数据表中的数据?
在 DataGridView 中编辑一个 TextBox 单元格,就像它是一个普通的 TextBox 一样(按下箭头时不会跳跃)