C# 在datagridview中编辑文本框

C# 在datagridview中编辑文本框,c#,winforms,datagridview,C#,Winforms,Datagridview,我的项目是带有实体框架的c#windows窗体,我有带有文本列的DataGridView。我想编辑最后一列文本列单元格[3]。 将所有值从数据库获取到GridView并不是问题。我明白了。 我可以输入一个新的值,但只要我点击它,它就会变为旧值。Textbox没有保留我要编辑的新值。 第3列中此单元格的ReadOnly为false,因为我可以写入,但会将新值更改回旧值。 我错过了什么样的事件?我该如何解决这个问题?从某种程度上看,Gridview似乎被锁定了。请帮忙 我甚至试过: foreach

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

            }

        }

}

当您使用“dgvOrder.DataSource=myOrder”时,无法编辑DataGrid iTen。


我的建议是在myOrder列表中执行和“for each”,并将一行一行地添加到网格中。之后,您可以执行另一个“for each”,从DataGrid恢复数据并以db.Order保存iTen。

如果我没有弄错的话,正常的System.Collections.Generic.List在直接绑定到时将不支持编辑,因为它没有为双向数据绑定实现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;
}
BindingSource不接受绑定到IBindingList,但仅使用此构造函数或在使用无参数构造函数后直接设置.DataSource属性。
保留上面的错误代码,以便阅读OP评论的其他人能够理解引用的内容。

我对Entity了解不够,但展示如何使用Entity绑定到datagridview可能会有所帮助?它需要是一个BindingList,而不仅仅是一个List,但答案表明,当您绑定到grid.Wonderfull时,它会自动转换为一个。它在没有绑定资源的情况下工作。如果我使用BindingSourse,则会出现以下错误“无法从'System.ComponentModel.BindingList'转换为'System.ComponentModel.IContainer'”啊,很高兴我们能让它正常工作:)编辑了我的原始评论,以反映BindingList不能包装在BindingSource中的事实,谢谢让我知道!
if (myOrder != null) {
   BindingList<Order> myBindingList = New BindingList<Order>(myOrder);
   BindingSource myBindingSource = New BindingSource(myBindingList);
   dgvOrder.DataSource = myBindingSource;
}
BindingSource myBindingSource = New BindingSource(myBindingList, Nothing);