我的项目是带有 Entity Framework 的 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);
}
}
}
最佳答案
如果我没记错的话,普通的 System.Collections.Generic.List 在直接绑定(bind)时将不支持编辑,因为它没有实现双向数据绑定(bind)的 IBindingList (或必要的 ListChanged 事件)。您可能需要将列表包装到 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,因此上面用于绑定(bind)到 BindingSource 的代码将不起作用,因为 BindingSource 的单参数构造函数专门采用 IContainer。如果您仍然想要要使用 BindingSource,应使用 BindingSource 的第三个构造函数,如下所示:
BindingSource myBindingSource = New BindingSource(myBindingList, Nothing);
BindingSource 确实接受绑定(bind)到 IBindingList,但只能使用此构造函数或在使用无参数构造函数后直接设置 .DataSource 属性。 留下上面的错误代码,以便其他阅读OP评论的人能够理解所引用的内容。
关于c# - 在 datagridview 内编辑文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59681713/