2017-11-16 7 views
0

내 DataGrid에서 한 행을 복사 한 다음 복사하는 데 문제가 있습니다. 선택한 여러 행에 대해 원하는대로 잘 작동합니다. 그러나 한 행에 대해서.C# DataGrid에서 한 행 복사

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

내가 하나 개의 행을 선택했을 때이 오류가 발생했습니다 :

이이 특정 라인에서 이제 복사 행

/// <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; 
     } 
    } 

에 대한 코드입니다. 이것은 "mscorlib.dll에서 'System.ArgumentOutOfRangeException'유형의 처리되지 않은 예외가 발생했습니다."

아이디어가 있습니까? 감사 :]

+0

아마도 foreach 문을 사용하여 valsCollection에 값을 추가하는 위치입니다. .SelectedItems를 사용하면 선택한 항목 하나를 선택하지 않아도되므로 콜렉션에 아무 것도 추가하지 않으므로 값을 가져 오려고 할 때 범위를 벗어납니다. – JohnChris

+0

슬프게도, 나는 DataGrid.SelectedIndex를 반복 할 수 없다. 어쩌면 단지 내가 datagrid.SelectedIndex 만 사용하는 새로운 조건이 필요하지만 실제로는 확실하지 않습니다. –

+0

SelectedIndex를 사용하여 테스트하고 작동하는지 확인하십시오. 단 하나만 반복하고, null인지 확인한 다음 목록에 추가 할 수 없습니다. – JohnChris

답변

0

DataGridRow에는 사용하려고하는 EnotifiedTruck이어야하는 Item 속성이 있습니다.

미리 별도의 컬렉션을 만드는 대신이를 사용할 수 있습니다.

또한, 선택한 행에 대한 valsCollection의 항목 만 만드는 동안 ItemsSource 컬렉션을 기반으로 모든 DataGridRow 개체가 GetDataGridRows에서 가져옵니다.

선택한 행이 1 개 있고 행 수가 2 개 이상인 경우 [1]에 도달하면 valsCollection에 [1]이 없어 범위를 벗어난 예외로 인해 실패해야한다고 생각합니다.

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

선택되지 않은 행은 건너 뜁니다.

+0

매력처럼 작동합니다. 정말 고맙습니다. :) –