C#绑定源值被覆盖
本文关键字:覆盖 绑定 | 更新日期: 2023-09-27 18:30:03
这是我的要求:我有一个数据网格视图,应该用sch.shift_detailsList(实体模型轮班)中提供的轮班详细信息中的员工轮班数据填充。例如:1周的班次(11月1日至11月7日)保存在sch.shift_detailsList中。因此,在数据网格视图中,如果周计数=2(即要保存2周的班次,即周期日期=7*2-1=13),则绑定源1(用于数据网格视图)应填充2周的班别,即如果开始日期为11月1,则sch.shift_detailsList的班次详细信息也应在第2周重复。因此,当循环结束第一周,然后i=7时,它应该再次从sch.shift_detailsList的第一项开始,bindingSource1(8)日期中的第八个条目应该是11月8日。但我的问题是,现在,bindingSource1(0)和sch.shift_detailsList(0)中的日期也被设置为11月8号,直到第6行的所有后续行都相应地被新值覆盖。我不知道为什么会发生这种事。如果有人能帮我,我将不胜感激。
List<Model.Shiftdetails> schdetails = new List<Model.Shiftdetails>();
bindingSource1.DataSource = schdetails;
gridControl1.DataSource = bindingSource1;
int k=0;
for (int i = 0,j=0; i <=cycledays; i+=7)
{
foreach (Model.Shiftdetails detail in sch.shift_detailsList)
{
Model.Shiftdetails cycleschdetails = new Model.Shiftdetails();
cycleschdetails = detail;
cycleschdetails.shift_date = dtCycleStartDate.DateTime.Date.AddDays(j);
j++;
k++;
if (cycleschdetails.schedule == null)
{
cycleschdetails.schedule = new Model.Schedule { id = -1, schedule_info = new Model.ScheduleInfo { schedule_name = crm.GetString("NoShift") }, schedule_flexible = true };
}
bindingSource1.Add(cycleschdetails);
bindingSource1.MoveNext();
if (k > cycledays)
break;
}
if (k > cycledays)
break;
}
values of binding source are now:
datasource[0] date=nov 8
datasource[1] date=nov 9
datasource[2] date=nov 10
datasource[3] date=nov 11
datasource[4] date=nov 12
datasource[5] date=nov 13
datasource[6] date=nov 14
datasource[7] date=nov 8
datasource[8] date=nov 9
datasource[9] date=nov 10
datasource[10] date=nov 11
datasource[11] date=nov 12
datasource[12] date=nov 13`enter code here`
datasource[13] date=nov 14
感谢
代码的问题是,当你这样做时:
cycleschdetails = detail;
CCD_ 1是对CCD_。因此,您在cycleschdetails
上所做的任何更改也将在detail
上进行。这在第一次运行时很好,但第二次,当您再次循环到这些相同的对象时,detail
将再次被修改,导致对其有引用的两个对象都被更改。
解决这个问题的方法是:与其将对象设置为对细节的引用,不如将对象的属性设置为彼此相等。只要它们是基元类型(字符串、整数、小数等),它们之间就不会创建引用。
类似于:
cycleschdetails.SomeString = detail.SomeString;
cycleschdetails.SomeInt = detail.SomeInt;
然而,如果您在其中嵌套了对象,您将遇到同样的问题,并且必须对这些对象执行同样的操作。
这很糟糕
cycleschdetails.CustomObject = detail.CustomObject;
这很好
cycleschdetails.CustomObject.SomeProperty = detail.CustomObject.SomeProperty;
你明白了;)基本问题是,当对象被设置为等于其他对象时,它们有绑定的引用,而基元类型则没有。
提供一个完整的例子(只是因为我喜欢自己的声音;)
class Program {
static void Main(string[] args) {
TestClass test1 = new TestClass() {
SomeInt = 1
};
Console.WriteLine(test1.SomeInt); // outputs 1
TestClass test2 = test1;
test2.SomeInt = 2;
Console.WriteLine(test1.SomeInt); // ouputs 2
TestClass test3 = new TestClass();
test3.SomeInt = test1.SomeInt;
test3.SomeInt = 4;
Console.WriteLine(test1.SomeInt); // ouputs 2 still
Console.ReadLine();
}
}
public class TestClass {
public int SomeInt { get; set; }
}