c# - 在 datagridview 内编辑文本框

标签 c# winforms datagridview

我的项目是带有 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/

相关文章:

c# - 条件 DataGridView 格式化

c# - 数据绑定(bind)问题

c# - ASP.NET MVC 4 中的 Global.asax.cs 文件采用什么模式?

.net - 当我调整标签的大小时,代码垃圾会在新的空白区域短暂显示

c# - 以编程方式向 datagridview 添加新行

c# - 将对象列表数据绑定(bind)到 WinForms DataGridView,但不显示某些公共(public)属性

c# - 在 .NET Core 中从 PEM 文件创建 X509Certificate2

c# - 如何基于泛型类型创建泛型实例

c# - 将日期时间选择器设为灰色?

c# - 使用计算机本地或网络中的sql服务器名称获取服务器名称