我发现了很多关于更新BindingList的问题和答案,并且在更新附加的DataGridView时遇到了问题,但我的问题恰恰相反,答案似乎并不适用。
BindingList填充了PanelSize:
类型public class PanelSize
{
public int PanelNumber { get; set; }
public double Width { get; set; }
public double Length { get; set; }
public bool TerminatesLeft { get; set; }
public bool TerminatesTop { get; set; }
public bool TerminatesRight { get; set; }
public bool TerminatesBottom { get; set; }
}
DataGridView使用此BindingList作为其DataSource。 (面板编号是只读的,布尔是复选框,双打是文本条目。)
dataGridView1.DataSource = userPanelBindingList;
我看到的行为是,对于仅在DataGridView中的FIRST条目,如果用户输入宽度和长度并且不检查任何bool值,则BindingList中的单个条目显示输入的Width值,但是长度为0(实际上有一个值,例如50.0)。
如果用户选中其中一个布尔值复选框,则所有字段都会正确更新。
令人抓狂。
回顾一下:用户输入:'50 .0'代表宽度,'55 .0'代表长度,并且不会检查4个终止...布隆中的任何一个。在DataGridView.RowLeave事件中,userPanelBindingList [0] .Width = 50.0,userPanelBindingList [0] .Height = 0.0。
我正在解释RowLeave事件中的数据,实际上是使用在DataGridView中输入的每个新行来运行实时计算。也许这是一个错误的事件来处理?
同样,如果用户输入Width = 50.0,Length = 55.0,并检查“Terminates Top”,则会在RowLeave事件的userPanelBindingList条目中填充所有值。
任何想法我正在做什么或不做什么导致这种行为的不可能的愚蠢行为?
非常感谢您的帮助。
肖恩
以下是我在新项目中展示该问题的简短示例:
public partial class Form1 : Form
{
public class PanelSize
{
public int PanelNumber;
public double Width;
public double Length;
public bool TerminatesLeft;
public bool TerminatesTop;
public bool TerminatesRight;
public bool TerminatesBottom;
}
private BindingList<PanelSize> bindingList;
private void Form1_Load(object sender, EventArgs e)
{
bindingList = new BindingList<PanelSize>();
dataGridView1.DataSource = bindingList;
}
private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
foreach (PanelSize sz in bindingList)
{
Console.WriteLine("Width: " + sz.Width);
Console.WriteLine("Length: " + sz.Length);
}
}
运行应用程序,为宽度输入50,为长度输入50,然后在DataGridView中输入新行,控制台显示:宽度:50长度:0“。再次执行此操作但检查框显示”宽度:50长度:50“