这是我的要求:我有一个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
由于
答案 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; }
}