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

感谢

C#绑定源值被覆盖

代码的问题是,当你这样做时:

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; }
}