在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' 转换为 'System.ComponentModel.IContainer'” 啊,很高兴我们可以让它工作 :) 编辑我的原始评论以反映 BindingList 不能被包装在 BindingSource 中的事实,感谢您告诉我!【参考方案2】:

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

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

【讨论】:

以上是关于在datagridview中编辑文本框的主要内容,如果未能解决你的问题,请参考以下文章

winform中。datagridview 选中某行 然后点击编辑。编辑的时候单元格变成文本框。

DataGridView使用技巧十一:DataGridView用户输入时,单元格输入值的设定

C# 如何使datagridview中的单元格处于可编辑

如何在不使用 datagridview 的情况下编辑绑定到组合框的数据表中的数据?

在 DataGridView 中编辑一个 TextBox 单元格,就像它是一个普通的 TextBox 一样(按下箭头时不会跳跃)

文本框在 DataGridview 文本框列中不可见