C#从datagrid复制一行

时间:2017-11-16 06:39:59

标签: c# wpf datagrid

我在从数据网格中复制一行然后复制它时遇到问题。 对于多个选定的行,它可以正常工作。但不是一排。

这是复制行的代码

/// <summary>
    /// Method which will copy entire row.
    /// </summary>
    private void CopyRow(object obj)
    {
        var datagrid = obj as System.Windows.Controls.DataGrid;

        List<string> valsCollection = new List<string>();

        foreach (ENotifiedTruck item in datagrid.SelectedItems)
        {
            valsCollection.Add(item.ToStringLP());
        }

        var rows = GetDataGridRows(datagrid);
        int i1 = 0;
        foreach (DataGridRow r in rows)
        {
            DataGridColumn column = datagrid.Columns[0];

            TextBlock cellcontent = column.GetCellContent(r) as TextBlock;

            valsCollection[i1] = string.Format("{0}\t{1}", cellcontent.Text, valsCollection[i1]);
            i1++;

        }

        datagrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        valsCollection.Insert(0, string.Empty);
        ApplicationCommands.Copy.Execute(null, datagrid);
        string oldresult = (string)Clipboard.GetData(DataFormats.Text);

        List<string> rowCollection = new List<string>();
        rowCollection = oldresult.Split(new char[] { '\n' }).ToList<string>();

        if (rowCollection.Count == 0)
            return;

        string last = rowCollection[0];
        rowCollection = new List<string>();
        rowCollection.Add(last);
        rowCollection.AddRange(valsCollection);          

        oldresult = string.Join("\n", rowCollection);
        Clipboard.SetText($"{oldresult}");
    }


    public IEnumerable<DataGridRow> GetDataGridRows(System.Windows.Controls.DataGrid grid)
    {
        var itemsSource = grid.ItemsSource as IEnumerable;
        if (null == itemsSource) yield return null;
        foreach (var item in itemsSource)
        {
            var row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(item);
            if (null != row) yield return row;
        }
    }

现在在这一特定行:

valsCollection[i1] = string.Format("{0}\t{1}", cellcontent.Text, valsCollection[i1]);

当我只选择一行时出错。 这是我从错误中获得的消息:“mscorlib.dll中发生了'System.ArgumentOutOfRangeException'类型的未处理异常”

有什么想法吗?谢谢:]

1 个答案:

答案 0 :(得分:0)

DataGridRow有一个Item属性,应该是您尝试使用的ENotifiedTruck。

您可以使用它而不是事先创建单独的集合。

此外,从它看起来,您将基于ItemsSource集合从GetDataGridRows获取所有DataGridRow对象,而您只在选定行的valsCollection中创建条目。

如果你有1个选定的行和2个或更多行,那么当你到[1]并且valsCollection没有[1]时,我认为这应该失败并超出范围异常。

if(!datagrid.SelectedItems.Contains(r.Item))
    continue;

将跳过未选择的任何行。