2013-11-01 3 views
1

각 GridView는 이전에 종속적 인 세 개의 GridView를 중첩합니다. asp 구조를 완료하고 각 각 해당 데이터 원본 (asp : aspx 페이지에서 SqlDataSource) 당기는 것입니다. 그러나 관계를 구축하는 방법을 알아낼 수 없으므로 각각은 격자가 중첩 된 행과 관련된 데이터 만 가져옵니다.부모에서 자식으로 매개 변수 전달 ASP GridView (C# 코드 숨김)

예 : Similar but I don't need the drill downs

Also very like what I'm looking for but this uses EntityDataSource

이러한 예는 내가이 일을 할 수있는 RowDataBound 이벤트가 필요합니다 이해하는 저를 도왔다. 큰! 하지만 RowDataBound 이벤트를 통해 다음 GridView에서 데이터를 생성하는 데이터 소스를 통해 실행해야하는 행마다 고유 한 매개 변수를 제공하는 방법을 파악할 수 없습니다.

Codebehind가 : 여기

protected void CategoryGrid_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
{ 
    //need to set my @catlinkulink parameter here 
} 

protected void CategoryGrid_SelectedIndexChanged(object sender, EventArgs e) 
{ 

} 


protected void CategoryOnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     GridView CategoryGridFC = DomainGrid.Rows[e.Row.RowIndex].FindControl("CategoryGrid") as GridView; 
     string catlinkulink = CategoryGridFC.DataKeys[e.Row.RowIndex].Values["catlinkulink"].ToString(); 

     TargetLinks.SelectParameters[0].DefaultValue = catlinkulink; 
    } 
} 

는 영문의 데이터 소스이다. 이전에 범주 그리드의 각 행에서 가져온 매개 변수에 따라 달라지는 모눈에 대한 것입니다.

<asp:SqlDataSource ID="TargetLinks" runat="server" 
ConnectionString="<%$ ConnectionStrings:MyDB %>" 
SelectCommand="SELECT t.ULink AS targetlinkulink, TargetDE 
       FROM targetLink t 
        INNER JOIN IntTargets it ON t.TargetULink = it.ULink 
        INNER JOIN IntCategoryLink cl ON t.CatLinkULink = cl.ULink 
        WHERE t.CatLinkULink = @catlinkulink" 
> 
<SelectParameters> 
    <asp:Parameter Name="catlinkulink" DefaultValue="0" Type="Empty" Size="0" ConvertEmptyStringToNull="False" DbType="Object" /> 
</SelectParameters> 

</asp:SqlDataSource> 

나는이게 얼마나 오랫동안 죄송하지만 난 내가 할 노력하고있어 명확한 아이디어를 제공 할 수있는 충분한 정보를 제공 있는지 확인하려면. 당신이 가지고있는 모든 의견에 감사드립니다. 나는 뭔가를 성취하기 위해 다른 방법이나 더 나은 방법이라 할지라도 항상 많이 배웁니다.

다음 제안 사항에 따라 TargetLinks 비트를 추가했습니다. CategoryGrid의 FindControl을 변경하여 DomainGrid (부모)의 행을 살펴 보았지만 작동하지 않습니다.

Error: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

다음은 중첩 된 GridView의 코드입니다.

<asp:GridView ID="DomainGrid" runat="server" 
    onselectedindexchanged="DomainGrid_SelectedIndexChanged" 
    DataSourceID="DomainLinks" AutoGenerateColumns="False" DataKeyNames="domainlinkulink"> 
    <Columns> 

     <asp:BoundField DataField="DomainDE" ShowHeader="False" 
       SortExpression="DomainDE" HeaderStyle-Width="125">  
     </asp:BoundField> 

     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:DropDownList ID="IntervCatDrop" runat="server" DataSourceID="IntervCatDD" 
       DataValueField="ulink" DataTextField="IntCategories"> 
       </asp:DropDownList>&nbsp;<asp:Button ID="AddIntCat" runat="server" Text="+" /> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:GridView ID="CategoryGrid" runat="server" DataKeyNames="catlinkulink" 
       DataSourceID="IntCategoryLinks" AutoGenerateColumns="false" 
       onselectedindexchanged="CategoryGrid_SelectedIndexChanged" 
       onrowdatabound="CategoryOnRowDataBound"> 
       <Columns> 

        <asp:BoundField DataField="IntCategories" ShowHeader="False" 
         SortExpression="Categories" HeaderStyle-Width="125"></asp:BoundField> 

        <asp:TemplateField ShowHeader="False"> 
         <ItemTemplate> 
           <asp:DropDownList ID="TargetDrop" runat="server" DataSourceID="TargetsDD" 
           DataValueField="ulink" DataTextField="TargetDE"> 
           </asp:DropDownList>&nbsp;<asp:Button ID="AddTarget" runat="server" Text="+" /> 
         </ItemTemplate> 
        </asp:TemplateField>  

        <asp:TemplateField ShowHeader="false"> 
        <ItemTemplate> 
          <asp:GridView ID="TargetGrid" runat="server" DataSourceID="TargetLinks" AutoGenerateColumns="False" 
          DataKeyNames="targetlinkulink" onselectedindexchanged="TargetGrid_SelectedIndexChanged" 
          > 
           <Columns> 
            <asp:BoundField DataField="TargetDE" ShowHeader="false" SortExpression="TargetDE" /> 
           </Columns> 
          </asp:GridView> 
         </ItemTemplate> 
        </asp:TemplateField> 

       </Columns> 
       </asp:GridView> 
      </ItemTemplate>    
     </asp:TemplateField> 
    </Columns> 





</asp:GridView> 
+1

행 바인딩 이벤트에서 asp : 매개 변수 값을 다음과 같이 설정하십시오. TargetLinks.SelectParameters [0] .DefaultValue = catlinkulink; – PushCode

+0

고마워요! 나는 그것을 추가했다. –

+0

@R_Scott - 당신이 얻고있는 오류는 무엇입니까, 방금 코멘트에 코드를 올렸습니까? –

답변

1

먼저 Parameter을 변경하는 것이 좋습니다. 잘못된 것으로 보입니다. 숨겨진 필드를 추가,

<SelectParameters> 
    <asp:Parameter Name="catlinkulink" Type="String" DefaultValue="" /> 
</SelectParameters> 

을 그리고 CategoryGrid 내부의 SqlDataSource를 이동 : 문자열 필드 CatLinkULink입니다 가정하면,이에 SelectParameters을 변경합니다.

<asp:gridview id="CategoryGrid" runat="server" datakeynames="catlinkulink" 
    datasourceid="IntCategoryLinks" autogeneratecolumns="false" 
    onselectedindexchanged="CategoryGrid_SelectedIndexChanged" 
    onrowdatabound="CategoryOnRowDataBound"> 
    <Columns> 
     <asp:BoundField DataField="IntCategories" ShowHeader="False" 
      SortExpression="Categories" HeaderStyle-Width="125"></asp:BoundField> 
     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:DropDownList ID="TargetDrop" runat="server" DataSourceID="TargetsDD" 
        DataValueField="ulink" DataTextField="TargetDE"> 
       </asp:DropDownList>&nbsp;<asp:Button ID="AddTarget" runat="server" Text="+" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField ShowHeader="false"> 
      <ItemTemplate> 
       <asp:GridView ID="TargetGrid" runat="server" DataSourceID="TargetLinks" AutoGenerateColumns="False" 
        DataKeyNames="targetlinkulink" OnSelectedIndexChanged="TargetGrid_SelectedIndexChanged"> 
        <Columns> 
         <asp:BoundField DataField="TargetDE" ShowHeader="false" SortExpression="TargetDE" /> 
        </Columns> 
       </asp:GridView> 
       <asp:HiddenField ID="hdnCatlinkulink" runat="server" Value='<%#Eval("catlinkulink") %>' /> 
       <asp:SqlDataSource ID="TargetLinks" runat="server" 
       ConnectionString="<%$ ConnectionStrings:MyDB %>" 
       SelectCommand="SELECT t.ULink AS targetlinkulink, TargetDE 
           FROM targetLink t 
            INNER JOIN IntTargets it ON t.TargetULink = it.ULink 
            INNER JOIN IntCategoryLink cl ON t.CatLinkULink = cl.ULink 
            WHERE t.CatLinkULink = @catlinkulink"> 
        <SelectParameters> 
         <asp:Parameter Name="catlinkulink" Type="String" DefaultValue="" /> 
        </SelectParameters> 
       </asp:SqlDataSource> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:gridview> 

그리고 코드에서 나는 매개 변수를 설정합니다 : 여기 CategoryGrid의 마크 업이 보일 수 있습니다 방법

protected void CategoryOnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     GridView TargetGrid = e.Row.FindControl("TargetGrid") as GridView; 
     HiddenField hdnCatlinkulink = e.Row.FindControl("hdnCatlinkulink") as HiddenField; 
     SqlDataSource TargetLinks = e.Row.FindControl("TargetLinks") as SqlDataSource; 

     if (TargetGrid != null && hdnCatlinkulink != null && TargetLinks != null) 
     { 
      string catlinkulink = hdnCatlinkulink.Value; 
      TargetLinks.SelectParameters[0].DefaultValue = catlinkulink; 
     } 
    } 
} 

면책 조항 : 나는 그것을 할 수있다 조정할 필요가 위의 코드를 테스트하지 않았다 .

+0

아직 작동하지 않습니다. 그래도 나는 실패한 것 같아. 나는 내가 알아낼 수있는 것을보기 위해 그걸로 계속 놀고 싶지만, 나는 지금 당장 그것을 버려야하고 사용자를위한 클릭이 더 많을지라도 나를위한 더 쉬운 길을 찾아야한다고 믿는다. 어느 쪽이든, 마감 기한이 흐트러 뜨려야합니다. 도움을 주시면 감사하겠습니다. 도움이된다면 다시 한번 감사드립니다. –

+0

괜찮 으면 나에게 소스를 보낼 수 있습니다. 나는 그들을 살펴보고 내일 아침까지 어떤 해결책을 제시 할 것입니다. – afzalulh

+0

마침내 진전을 보았습니다. 코드 제안 이었기 때문에 진전이 있다고 말해야합니다. sqldatasource를 gridview로 옮겼지만 부모/자식 둥지의 잘못된 수준에 배치했습니다. 너의 너무나 관대 한 제안이 나를 위해이 일을 할 수있어서 정말 고마워. 나는 다른 누군가가 나를 위해 일하는 것을 싫어하지만, 나는 매우 좌절감을 느끼고있었습니다. 나는 카테고리 위의 둥지에 이것을 사용할 수 있어야하며 괜찮을 것 같아요. 나는 너에게 충분히 감사 할 수 없다. –

-1

숨겨진 div에 텍스트 상자를 설정하여 그리드 선택 이벤트가 발생했을 때 값을 가져올 수 있습니다. 그리고 sqldatasource에서이 textbox.text에 매개 변수를 설정할 수 있습니다. 이것은 내가이 상황에서 수행 한 작업입니다.

관련 문제