【问题标题】:Editing textbox inside datagridview在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,但答案表明当您绑定到网格时它会自动转换为一个。

标签: c# winforms datagridview


【解决方案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 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多