2013-11-01 79 views
1

我嵌套了三個GridView,其中每個都依賴於前一個。我已經完成了asp結構,並且每個都從各自的數據源(aspx頁面中的asp: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中生成數據。

代碼隱藏:

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; 
    } 
} 

下面是從ASPX數據源。這是針對依賴於從類別網格的每一行拉取的參數的網格。

<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,看起來不對。假設CatLinkULink是一個字符串場,我會改變SelectParameters這樣的:

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

並移動的SqlDataSource的CategoryGrid內,加一個隱藏字段。下面是CategoryGrid的標記如何可以看:

<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> 

而在代碼中,我將設置參數:

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的參數。 這就是我爲這種情況所做的

相關問題