首页 > 解决方案 > 在datagridview中编辑文本框

问题描述

我的项目是带有实体框架的 c# windows 窗体,并且我有带有 TextColumn 的 DataGridView。我想编辑最后一列 TextColumn Cells[3]。将所有值从数据库获取到 GridView 是没有问题的。我明白了。而且我可以输入一个新值,但只要我点击 ontherplace,它就会更改为旧值。文本框没有保留我要编辑的新值。对于第 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);

            }

        }

}

标签: c#winformsdatagridview

解决方案


如果我没记错的话,直接绑定到的普通 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 评论的其他人了解所引用的内容。


推荐阅读