2014-10-29 4 views
0

좋은 하루. 는 데이터 그리드 (sumOperationGrid)를 포함하는 데이터 그리드 (operationGrid) RowDetailsTemplate을 가지고보내는 중 DataGrid (DataGridRowDetailsEventArgs e) AsyncResult

  <DataGrid AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" IsReadOnly="True" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=OperCountUnits}" Name="operationGrid" RowDetailsVisibilityMode="VisibleWhenSelected" SelectionMode="Single" VerticalContentAlignment="Bottom" Grid.ColumnSpan="2" Margin="6,60,7,6" LoadingRowDetails="operationGrid_LoadingRowDetails" SelectionChanged="operationGrid_SelectionChanged"> 
       <DataGrid.Columns> 
        <DataGridTextColumn x:Name="Id" Binding="{Binding Path=Id}" Header="{Binding NumberOfOperation, Source={StaticResource resources}}" IsReadOnly="True" /> 
        <DataGridTextColumn x:Name="StartedAt" Binding="{Binding Path=StartedAt, Converter={StaticResource ConvertCultureDate}}" Header="{Binding StartedAt, Source={StaticResource resources}}" IsReadOnly="True" /> 
        <DataGridTextColumn x:Name="FinisedAt" Binding="{Binding Path=FinishedAt, Converter={StaticResource ConvertCultureDate}}" Header="{Binding FinishedAt, Source={StaticResource resources}}" IsReadOnly="True" /> 
        <DataGridTextColumn x:Name="CountMode" Binding="{Binding Path=Description}" Header="{Binding CountMode, Source={StaticResource resources}}" IsReadOnly="True" /> 
        <DataGridTextColumn x:Name="CurrencyCode" Header="{Binding CurrcencyCode, Source={StaticResource resources}}" IsReadOnly="True" /> 
        <DataGridTextColumn x:Name="UnitId" Binding="{Binding Path=UnitId}" Header="UnitId" IsReadOnly="True" Visibility="Collapsed" /> 
        <DataGridTextColumn x:Name="CountModeId" Binding="{Binding Path=CountModeId}" Header="CountModeId" IsReadOnly="True" Visibility="Collapsed" /> 
        <DataGridTextColumn x:Name="HotListCount" Binding="{Binding Path=HotListCount}" Header="Фальш" IsReadOnly="True" Visibility="Collapsed" /> 
      </DataGrid.Columns> 
       <DataGrid.RowDetailsTemplate> 
        <DataTemplate> 
         <DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding CurrencySum}" Name="sumOperationGrid" SelectionChanged="sumOperationGrid_SelectionChanged" SelectionMode="Single"> 
          <DataGrid.Columns> 
           <DataGridTextColumn Binding="{Binding csId}" Visibility="Collapsed" /> 
           <DataGridTextColumn Binding="{Binding CurrId}" Visibility="Collapsed" /> 
           <DataGridTextColumn Binding="{Binding Curr}" Header="{Binding Currency, Source={StaticResource resources}}" /> 
           <DataGridTextColumn Binding="{Binding TotalSum, Converter={StaticResource replaceNull}}" Header="{Binding Sum, Source={StaticResource resources}}" /> 
          </DataGrid.Columns> 
         </DataGrid> 
        </DataTemplate> 
       </DataGrid.RowDetailsTemplate> 
      </DataGrid> 

요청은 WCF 서비스이며, 다음, 그것은 밝혀 대답은 당신이 대리인을 통해 데이터를 제출하는 경우 모든 좋은입니다 대답은 DataGrid (sumOperationGrid)에 와서 표시됩니다.

private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum); 
    private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
    { 
     OperCountUnit _con = (OperCountUnit)e.Row.DataContext; 
     DataGrid s2 = e.DetailsElement.FindName("sumOperationGrid") as DataGrid; 
     client.BeginGetCurrencySumByCurrentItem((int)_con.Id, 
      new AsyncCallback(
      delegate(IAsyncResult result) 
      { 
       List<CurrencySum> sum = client.EndGetCurrencySumByCurrentItem(result).ToList<CurrencySum>(); 
       if (sum != null) 
       { 
        s2.Dispatcher.BeginInvoke(new CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke), new object[2] {s2, sum}); 
       } 
      } 
      ), null); 
     } 

    void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid, List<CurrencySum> sum) 
    { 
     sumGrid.ItemsSource = sum; 
    } 

시도했습니다.

private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
{ 
OperCountUnit _con = (OperCountUnit)e.Row.DataContext; 
DataGrid s2 = e.DetailsElement.FindName("sumOperationGrid") as DataGrid; 
client.BeginGetCurrencySumByCurrentitem((int)_con.Id, new AsyncCallback  (GetCurrencySumByCurrentItemCallBack), null); 
} 

private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum); 
private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result) 
{ 
DataGridRow opGrRow = (DataGridRow)(this.operationGrid.ItemContainergenerator.containerfromitem  (this.operationGrid.Items.Currentitem)); 
ContentPresenter cpOpGrRow = FindVisualChild<ContentPresenter>(opGrRow); 
DataTemplate dtOpGrRow = cpOpGrRow.ContentTemplate; 
DataGrid s2 = (DataGrid)dtOpGrRow.FindName("sumOperationGrid", cpOpGrRow); 

} 

void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid, List<CurrencySum> sum) 
{ 
sumGrid.ItemsSource = sum; 
} 

private childItem FindVisualChild<childItem>(DependencyObject obj) 
where childItem : DependencyObject 
{ 
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
{ 
DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
if (child != null && child is childItem) 
return (childItem)child; 
else 
{ 
childItem childOfChild = FindVisualChild<childItem>(child); 
if (childOfChild != null) 
return childOfChild; 
} 
} 
return null; 
} 

와 두 경우 모두 너무

private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
{ 
OperCountUnit _con = (OperCountUnit)e.Row.DataContext; 
DataGrid s2 = e.DetailsElement.FindName("sumOperationGrid") as DataGrid; 
client.BeginGetCurrencySumByCurrentitem((int)_con.Id, new AsyncCallback (GetCurrencySumByCurrentItemCallBack), s2); 
} 

private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum); 
private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result) 
{ 
DataGrid s2 = result.AsyncState as DataGrid 
List<CurrencySum> sum = client.EndGetCurrencySumByCurrentitem(result).ToList<CurrencySum>(); 
if (sum != null) 
{ 
s2.Dispatcher.BeginInvoke(new CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke),  new object[2] {s2, sum}); 
} 


} 

void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid, List<CurrencySum> sum) 
{ 
sumGrid.ItemsSource = sum; 
} 

는 모든 오류 아래로 비등 "이 개체의 소유자가 다른 스레드이기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다."

client.BeginGetCurrencySumByCurrentitem에서 대리인을 제거하고 데이터 테이블 s2를 별도의 함수로 전달하는 방법에 대한 질문은 무엇입니까? 흐름으로 돌아가서 데이터를 테이블 sumOperationGrid로로드하려면 어떻게해야합니까?

+0

당신이 점점 오류를 변경? – Reniuz

+0

sumOperationGrid datagrid GetCurrencyByCurrentItemCallback 함수를 찾을 때 오류가 발생했습니다. – karapuz

+0

처음 시도한 코드 버전에 대해 생각해 보았습니다. – Reniuz

답변

0

지저분한 코드를 이해하면 왜 모든 데이터 그리드를 통과해야하는지 이해할 수 없습니다. 그리드에 액세스하고 합계 만 전달하여 작업 끝에서 ItemsSource를 설정하십시오. 다음은 콜백 함수의 의사입니다 :

private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result) 
{ 
    if(sum != null) 
    { 
     this.Invoke(new Action(()=> 
     { 
      //get data grid 
      //set ItemSource 
     }) 
    } 
} 

가 아니면 데이터 그리드를해야하는 경우 다음과 같이 뭔가를 시도를 호출하기 :

DataGrid myDataGrid; 
private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
{ 
    OperCountUnit _con = (OperCountUnit)e.Row.DataContext; 
    myDataGrid = e.DetailsElement.FindName("sumOperationGrid") as DataGrid; 
    //do stuff without passing grid 
} 

private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result) 
{ 
    List<CurrencySum> sum = client.EndGetCurrencySumByCurrentitem(result).ToList<CurrencySum>(); 
    if (sum != null) 
    { 
     myDataGrid.Dispatcher.BeginInvoke(new Action(()=> 
     { 
      myDataGrid.ItemSource = sum; 
     }); 
} 
0

네를. 이것은 좋은 생각입니다. 많은 감사합니다!

private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result) 
{ 
    if(sum != null) 
    { 
     this.Invoke(new Action(()=> 
     { 
      //get data grid 
      //set ItemSource 
     }) 
    } 
} 

나는 내 코드

private void operationGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
    { 
     OperCountUnit _con = (OperCountUnit)e.Row.DataContext; 
     client.BeginGetCurrencySumByCurrentItem((int)_con.Id, new AsyncCallback(GetCurrencySumByCurrentItemCallBack), null); 
    }   

    private delegate void CurrencySumByCurrentItemInvoke(List<CurrencySum> sum); 
    private void GetCurrencySumByCurrentItemCallBack(IAsyncResult result) 
    { 
     List<CurrencySum> sum = client.EndGetCurrencySumByCurrentItem(result).ToList<CurrencySum>(); 
     if (sum != null) 
     { 
      Dispatcher.Invoke(new CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke), new object[1] { sum }); 
     }   
    } 

    void GetCurrencySumByCurrentItemInvoke(List<CurrencySum> sum) 
    { 
     DataGridRow opGrRow = (DataGridRow)(this.operationGrid.ItemContainerGenerator.ContainerFromItem(this.operationGrid.SelectedItem)); 
     DataGridDetailsPresenter cpOpGrRow = FindVisualChild<DataGridDetailsPresenter>(opGrRow); 
     DataTemplate dtOpGrRow = cpOpGrRow.ContentTemplate; 
     DataGrid s2 = (DataGrid)dtOpGrRow.FindName("sumOperationGrid", cpOpGrRow); 
     s2.ItemsSource = sum; 
    }