仅将数据添加到特定列

时间:2016-02-01 19:12:21

标签: c# wpf datagrid

我正在尝试找到一种方法将数据从一个数据网格添加到另一个数据网格,并且该数据在我的第二个数据网格中一次只插入一列。每次单击Add按钮时都会创建特定列。

到目前为止我的编码:

private void btnFeedbackAddSupplier_Click(object sender, RoutedEventArgs e)
{
    dgFeedbackSelectSupplier.Items.Clear(); //So that my rows do not stack each other on every add

    DataGridTextColumn columnSupplier = new DataGridTextColumn();
    columnSupplier.Binding = new Binding("Supplier");
    DataGridTextColumn columnFeedbackSupplierItem = new DataGridTextColumn();
    //The 'Item' column is binded in XAML
    columnSupplier.Header = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Name;
    columnSupplier.IsReadOnly = true;

    dgFeedbackAddCost.SelectAll(); //Selects all the rows in 1st datagrid

    //Casts selected rows to my 'ViewQuoteItemList' class
    IList list = dgFeedbackAddCost.SelectedItems as IList;
    IEnumerable<ViewQuoteItemList> items = list.Cast<ViewQuoteItemList>();

    var collection = (from i in items let a = new ViewQuoteItemList { Item = i.Item, Supplier = i.Cost }
                          select a).ToList();

    //Adds both the column and data to the 2nd datagrid
    dgFeedbackSelectSupplier.Columns.Add(columnSupplier);
    foreach (var item in collection)
        dgFeedbackSelectSupplier.Items.Add(item);
}

我想要一次只将数据添加到一个单独的列的原因是因为每次我想将数据添加到第二个数据网格时数据都不同,并且它会覆盖在旧版本中输入的任何先前数据。

编辑:我以下是我当前问题的一些图片

在这里,我添加了第一家公司及其价值观。一切正常 First image

在这里,我添加了第二家公司的新值,但它更改了第一家公司输入的值。这是我的大问题。因此,您可以看到我的值如何从第一个图像更改为第二个图像

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为您的问题是所有列都绑定到同一属性:Supplier。由于您每次都在更新该属性,因此所有列都分配了相同的值。最后,每行只有一个Supplier属性,因此您不能在每个列上显示该单个属性的不同值,因为每次更改该属性的值时,Bindings都会收到通知并自行更新。

也许您可以尝试使用OneTime绑定而不是常规绑定。这样,单元格将保留第一次将它们添加到DataGrid时的值。但要实现这一点,您应该避免清除DataGrid的项目列表,因为重新添加项目会强制它们再次重新绑定。

另一种选择是在您的Supplier属性中包含供应商列表,并使每列绑定到该列表的索引。

private void btnFeedbackAddSupplier_Click(object sender, RoutedEventArgs e) 
{

    // ...        

    columnSupplier.Binding = new Binding(string.Format("Supplier[{0}]", supplierColumnIndex));

    // ...

    var supplierCosts = new List<int>();

    // ...
    // Fill the list with the Costs of the Suppliers that correspond to each column and item
    // ...

    var collection = (from i in items let a = new ViewQuoteItemList { Item = i.Item, Supplier = supplierCosts }
                          select a).ToList();

    //Adds both the column and data to the 2nd datagrid
    dgFeedbackSelectSupplier.Columns.Add(columnSupplier);
    foreach (var item in collection)
        dgFeedbackSelectSupplier.Items.Add(item); 
}