2010-10-26 26 views
1

J'ai besoin de connecter deux balises ObjectDataSource. Premier aura un paramètre de chaîne de requête et le second a un paramètre, qui est l'un des champs dans le jeu de résultats de la première. La relation est un à un, je ne peux pas mettre un deuxième dans une grille et utiliser le paramètre de contrôleconnect two ObjectDataSources

<asp:ObjectDataSource ID="OrderObjectDataSource" runat="server" 
    SelectMethod="GetById" 
    TypeName=" MyProject.Business.Repositories.OrderRepository" 
    OnSelected="OrderObjectDataSource_OnSelected"> 
    <SelectParameters> 
     <asp:QueryStringParameter DefaultValue="86" Name="orderId" 
      QueryStringField="ioid" Type="Int32" /> 
    </SelectParameters> 
    </asp:ObjectDataSource> 
<asp:ObjectDataSource runat="server" ID="AdvertiserObjectDataSource" 
    TypeName="MyProject.Business.Repositories.AdvertiserRepository" 
    SelectMethod="GetAdvertiserById" 
    OnSelecting="AdvertiserObjectDataSource_OnSelecting"> 
    <SelectParameters> 
     <asp:Parameter Name="advertiserId" Type="Int32" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 
</asp:Content> 


    private Order _order; 
    protected void OrderObjectDataSource_OnSelected(object source, ObjectDataSourceStatusEventArgs e) 
    { 
     if (e.ReturnValue != null) 
     { 
      _order = (Order) e.ReturnValue; 
      AdvertiserObjectDataSource.SelectParameters["advertiserId"].DefaultValue = 
         _order.AdvertiserId.ToString(); 
      AdvertiserObjectDataSource.Select(); 
     } 
    } 

    protected void AdvertiserObjectDataSource_OnSelecting(object source, ObjectDataSourceSelectingEventArgs e) 
    { 
     if (_order != null) 
      e.InputParameters["advertiserId"] = _order.AdvertiserId; 
    } 

Cela ne fonctionne pas parce que AdvertiserObjectDataSource_OnSelecting est appelée avant OrderObjectDataSource_OnSelected.

Nous vous remercions de votre aide.

+0

Vous pourriez être mieux créer une nouvelle ObjectDataSource qui contient tous les éléments dont vous avez besoin. Vous pouvez incorporer des éléments de vos deux ObjectDataSources d'origine dans la nouvelle ObjectDataSource, si vous le souhaitez. –

+0

Je dois les garder séparés, ils sont connectés au ReportViewer et il y en aura 4, cela n'aurait pas de sens de combiner autant de données dans un jeu de données, ou est-ce que vous vouliez dire quelque chose d'autre? – Mike

Répondre

0

Nous venons de faire fonctionner, voici ce que je l'ai fait:

<asp:ObjectDataSource ID="OrderObjectDataSource" runat="server"/> 
<asp:ObjectDataSource runat="server" ID="AdvertiserObjectDataSource" /> 

private Order _order; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    OrderObjectDataSource.TypeName = "MyProject.Business.Repositories.OrderRepository"; 
    OrderObjectDataSource.SelectMethod = "GetById"; 
    OrderObjectDataSource.SelectParameters.Clear(); 
    OrderObjectDataSource.SelectParameters.Add(new QueryStringParameter("orderId", 
                DbType.Int32, Proposal_Id_QS_Key)); 
    OrderObjectDataSource.Selected += OrderObjectDataSource_OnSelected;  
    AdvertiserObjectDataSource.TypeName = "MyProject.Business.Repositories.AdvertiserRepository"; 
    AdvertiserObjectDataSource.SelectMethod = "GetAdvertiserById"; 
    AdvertiserObjectDataSource.SelectParameters.Clear(); 
    AdvertiserObjectDataSource.SelectParameters.Add(new Parameter("advertiserId", DbType.Int32)); 
    AdvertiserObjectDataSource.Selecting += AdvertiserObjectDataSource_OnSelecting; 

    OrderObjectDataSource.Select(); 
} 


protected void OrderObjectDataSource_OnSelected(object source, ObjectDataSourceStatusEventArgs e) 
{ 
    if (e.ReturnValue != null) 
    { 
     _order = (Order) e.ReturnValue; 
     AdvertiserObjectDataSource.SelectParameters["advertiserId"].DefaultValue = 
     _order.AdvertiserId.ToString(); 
     AdvertiserObjectDataSource.Select(); 
     } 
} 


protected void AdvertiserObjectDataSource_OnSelecting(object source, ObjectDataSourceSelectingEventArgs e) 
{ 
    if (_order != null) 
      e.InputParameters["advertiserId"] = _order.AdvertiserId; 
}