c# - 在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);
}
}
}
解决方案
如果我没记错的话,直接绑定到的普通 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 评论的其他人了解所引用的内容。
推荐阅读
- python - Reduce the dimension of a tensor using max-pooling layer
- javascript - Material-UI:选项卡没有响应内部的数据表
- javascript - 如何检查表格的值是否与下一个值串联其他突出显示单元格
- python - Python AES 加密。每个文件的前 16 个字符,但一个被编码字节替换
- python - How to get the sub document within a nested array in MongoDB?
- php - How to download as CSV file from woocommerce product displayed by php table script?
- python - 在 argParser python 中为每个标志显示选项
- swift - 如何在 UITabBarViewController 的选项卡中显示?
- regex - Exact Regex expression for floating point number is not working
- c++ - gnu microhttpd 中的 css 和其他