C# 发送DataGrid(DataGridRowDetailsEventArgs e)异步结果
你好。 具有DataGrid(operationGrid)RowDetailsTemplate,其中包含DataGrid(sumOperationGrid)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 );
请求的是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;
}