如何防止重复变量与实际变量一起变化?

时间:2014-03-20 04:15:32

标签: c# wpf datagrid

这就是问题所在:

if (commItems[0].CardNO == "" && commItems[0].Serial == "")
{               
    gridCommsItem.ItemsSource = commItems;
    tempGrid = gridCommsItem;
    gridCommsItem.Columns.Clear();
        .
        .
        .
}

基本上我有2 datagrid。 1个实际的datagrid" gridCommsItem"和重复的数据网格" tempGrid"。在我做gridCommsItem.Columns.Clear()之前,我想在tempGrid中存储gridCommsItem的所有属性,以便我可以在以后的代码中方便地恢复。

但是,通过设置断点,我在执行行IMMEDIATELY后发现"gridCommsItem.Columns.Clear();",tempGrid也随gridCommsItem一起更新;所有列都清除了!我怎么能避免这个?

3 个答案:

答案 0 :(得分:0)

  

我在执行gridGemsItem.Columns.Clear();

行后立即发现了这一点

看起来您已使用gridCommsItem源绑定了第二个网格。这就是为什么清除gridCommsItem也会清除其他网格。

  

我希望在tempGrid中存储gridCommsItem的所有属性,以便我可以   在以后的代码中方便地恢复。

我建议您将所有属性存储在某种xml文件中,以便以后进行恢复,而不是保存完整的网格。

答案 1 :(得分:0)

DataGrid通过引用传递,而不是按值传递;因此,当您清除一个变量时,实际上是清除了另一个变量引用的原始数据网格;因此,两个变量现在都不包含任何内容。

为避免这种情况,您必须对数据结构进行深层复制。您需要复制内容。

看看下面的链接;它解释了如何做到这一点。链接中的代码段

private void copyDgv1ValueToDgv2()
        {
            //using import method to copy the datatable of dgv1 to dgv2
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                f2.dt2.ImportRow(dt.Rows[i]);
            }

            //or to manually copy the data rows of dgv1 to dgv2 using this method
            /*for (int i = 0; i < dt.Rows.Count; i++)
            {
                f2.dt2.Rows.Add(dataGridView1.Rows[i].Cells[0].Value.ToString(), dataGridView1.Rows[i].Cells[1].Value.ToString(),
                    dataGridView1.Rows[i].Cells[2].Value.ToString());
            }*/
        }

链接: http://social.msdn.microsoft.com/Forums/windows/en-US/fe0539b0-a436-4a04-85cc-b05d111befba/passing-datagridview-values-to-datagridview-in-another-form?forum=winformsdatacontrols

答案 2 :(得分:0)

本准则可能对您有所帮助。 您需要复制所有属性并创建主gridComms的克隆对象

static public void CloneObject(object dest, object src)
    {
        Type t = src.GetType();
        PropertyInfo[] properties = t.GetProperties();

        foreach (PropertyInfo pi in properties)
        {
            if (pi.CanWrite)
            {
                pi.SetValue(dest, pi.GetValue(src, null), null);
            }
        }
    }