C# 发送DataGrid(DataGridRowDetailsEventArgs e)异步结果

C# 发送DataGrid(DataGridRowDetailsEventArgs e)异步结果,c#,wpf,wcf,datagrid,iasyncresult,C#,Wpf,Wcf,Datagrid,Iasyncresult,你好。 具有DataGrid(operationGrid)RowDetailsTemplate,其中包含DataGrid(sumOperationGrid) 请求的是WCF服务,结果证明一切都很好 如果您通过代理提交数据,则答案将显示在datagrid(sumOperationGrid)中 private delegate void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List<CurrencySum> sum );

你好。 具有DataGrid(operationGrid)RowDetailsTemplate,其中包含DataGrid(sumOperationGrid)


请求的是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;
    } 
私有委托void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List sum);
私有void操作Grid_加载行详细信息(对象发送方、DataGridRowDetailsSeventargs e)
{
OperCountUnit _con=(OperCountUnit)e.Row.DataContext;
DataGrid s2=e.DetailsElement.FindName(“sumOperationGrid”)作为DataGrid;
client.BeginGetCurrencySumByCurrentItem((int)_con.Id,
新异步回调(
委托(IAsyncResult结果)
{
List sum=client.EndGetCurrencySumByCurrentItem(result.ToList();
如果(总和!=null)
{
s2.Dispatcher.BeginInvoke(新的CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke)),新对象[2]{s2,sum};
}
}
),空);
}
void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid,列表总和)
{
sumGrid.ItemsSource=总和;
} 
我试过了

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\u加载行详细信息(对象发送方、DataGridRowDetailsEventArgs e)
{
OperCountUnit _con=(OperCountUnit)e.Row.DataContext;
DataGrid s2=e.DetailsElement.FindName(“sumOperationGrid”)作为DataGrid;
client.BeginGetCurrencySumByCurrentitem((int)_con.Id,新的AsyncCallback(GetCurrencySumByCurrentItemCallBack),null);
}
私有委托void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List sum);
私有void GetCurrencySumByCurrentItemCallBack(IAsyncResult结果)
{
DataGridRow opGrRow=(DataGridRow)(this.operationGrid.ItemContainergenerator.containerfromitem(this.operationGrid.Items.Currentitem));
ContentPresenter cpOpGrRow=FindVisualChild(opGrRow);
DataTemplate dtOpGrRow=cpOpGrRow.ContentTemplate;
DataGrid s2=(DataGrid)dtOpGrRow.FindName(“sumOperationGrid”,cpOpGrRow);
}
void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid,列表总和)
{
sumGrid.ItemsSource=总和;
}
私有子项FindVisualChild(DependencyObject obj)
where-childItem:DependencyObject
{
for(int i=0;i
诸如此类

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;
}
private void operationGrid\u加载行详细信息(对象发送方、DataGridRowDetailsEventArgs e)
{
OperCountUnit _con=(OperCountUnit)e.Row.DataContext;
DataGrid s2=e.DetailsElement.FindName(“sumOperationGrid”)作为DataGrid;
client.BeginGetCurrencySumByCurrentitem((int)con.Id,新的AsyncCallback(GetCurrencySumByCurrentItemCallBack),s2);
}
私有委托void CurrencySumByCurrentItemInvoke(DataGrid sumGrid,List sum);
私有void GetCurrencySumByCurrentItemCallBack(IAsyncResult结果)
{
DataGrid s2=result.AsyncState作为DataGrid
List sum=client.EndGetCurrencySumByCurrentitem(result.ToList();
如果(总和!=null)
{
s2.Dispatcher.BeginInvoke(新的CurrencySumByCurrentItemInvoke(GetCurrencySumByCurrentItemInvoke)),新对象[2]{s2,sum};
}
}
void GetCurrencySumByCurrentItemInvoke(DataGrid sumGrid,列表总和)
{
sumGrid.ItemsSource=总和;
}
在这两种情况下,都归结为错误 “调用线程无法访问此对象,因为此对象的所有者是另一个线程。”

如何从client.BeginGetCurrencySumByCurrentitem中删除委托并在单独的函数中转发数据表s2?
我如何回到您的流中并将数据加载到表sumOperationGrid中?

如果我理解了凌乱的代码,我就无法理解您为什么要到处通过数据网格。仅尝试访问网格,并仅通过传递sum在操作结束时设置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;
         });
}
DataGrid-myDataGrid;
私有void操作Grid_加载行详细信息(对象发送方、DataGridRowDetailsSeventargs e)
{
OperCountUnit _con=(OperCountUnit)e.Row.DataContext;
myDataGrid=e.DetailsElement.FindName(“sumOperationGrid”)作为DataGrid;
//不通过网格就做事情
}
私有void GetCurrencySumByCurrentItemCallBack(IAsyncResult结果)
{
List sum=client.EndGetCurrencySumByCurrentitem(result.ToList();
如果(总和!=null)
{
myDataGrid.Dispatcher.BeginInvoke(新操作(()=>
{
myDataGrid.ItemSource=总和;
});
}

是的。这是个好主意。非常感谢

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;
    }
private void operationGrid\u加载行详细信息(对象发送方、DataGridRowDetailsEventArgs e)
{
OperCountUnit _con=(OperCountUnit)e.Row.DataContext;
client.BeginGetCurrencySumByCurrentItem((int)_con.Id,新的AsyncCallback(GetCurrencySumByCurrentItemCallBack),null);
}        
私有委托无效CurrencySumByCurrentItemInvoke(列表总和);
私有void GetCurrencySumByCurrentItemCallBack(IAsyncResult结果)
{
列表总和=client.EndGetCurrencySumByCurren
    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;
    }