C#+ bindingsource值被覆盖

时间:2014-11-11 14:16:13

标签: c# datagridview

这是我的要求:我有一个datagridview,应该在sch.shift_detailsList(实体模型转换)中提供转移详细信息中的员工转移数据。例如:如果周期数= 2,则将数据移动1周(nov 1至nov 7)保存在数据网格视图中的sch.shift_detailsList.So中(即转移保存2周,即循环= 7 * 2 -1 = 13 ),bindingsource1(对于datagridview)应该使用shift填充2周,即如果以nov1给出的开始日期,那么sch.shift_detailsList中的移位细节也应该在第2周重复。因此,当循环结束第一周然后i = 7时,它应该从sch.shift_detailsList的第一项开始,而bindingSource1(8)日期的第8项应该是nov 8th。但我的问题是现在, bindingSource1(0)和sch.shift_detailsList(0)中的date也被设置为nov 8th,并且相应地用新值覆盖直到第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

由于

1 个答案:

答案 0 :(得分:2)

代码存在问题,当你这样做时:

cycleschdetails = detail;

cycleschdetails是对detail的引用。因此,您在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; }
}