我在从数据网格中复制一行然后复制它时遇到问题。 对于多个选定的行,它可以正常工作。但不是一排。
这是复制行的代码
/// <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'类型的未处理异常”
有什么想法吗?谢谢:]
答案 0 :(得分:0)
DataGridRow有一个Item属性,应该是您尝试使用的ENotifiedTruck。
您可以使用它而不是事先创建单独的集合。
此外,从它看起来,您将基于ItemsSource集合从GetDataGridRows获取所有DataGridRow对象,而您只在选定行的valsCollection中创建条目。
如果你有1个选定的行和2个或更多行,那么当你到[1]并且valsCollection没有[1]时,我认为这应该失败并超出范围异常。
if(!datagrid.SelectedItems.Contains(r.Item))
continue;
将跳过未选择的任何行。