2012-06-13 2 views
3

Я использую Вложенные GridViews, где каждая строка в gridview имеет дочерний gridView. Я использую RowDataBound Event of Parent GridView, to Binding Ребенок GridView. Моя проблема в том, что, как получить ключ родительского GridView на детском gridViews RowDataBound Событие.Вложенные gridview получить родительскую строку

Ниже приведен пример кода:

<asp:GridView ID="gvParent" DataKeyNames="ID" runat="server" PageSize="1" AllowPaging="true" PagerSettings-Mode="NextPrevious" AutoGenerateColumns="False" SkinID="GVCenter" onrowdatabound="gvParent_RowDataBound"> 
    <Columns> 
     <asp:BoundField DataField="Name" /> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:GridView ID="gvChild" DataKeyNames="ID" runat="server" AutoGenerateColumns="false" ShowHeader="false" OnRowDataBound="gvChild_RowDataBound"> 
        <Columns> 
        <asp:BoundField DataField="Name" />      
        </Columns> 
       </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Вот код позади:

protected void gvParent_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      GridView gvChild= (GridView)e.Row.FindControl("gvChild"); 
      gvChild.DataSource = getChildObj(); 
      gvChild.DataBind(); 
     } 
    } 

    protected void gvChild_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      // Here I need to get the parent gridview Row Key 
     } 
    } 

Надежда выше код объясняет все сценарии.

Заранее спасибо Sandy

+0

На RowDataBound для родительского GridView установлен идентификатор для дочерней сетки для строки. – k0stya

ответ

7

Попробуйте

<asp:GridView ID="gvParent" DataKeyNames="ID" runat="server" PageSize="10" AllowPaging="true" 
      PagerSettings-Mode="NextPrevious" AutoGenerateColumns="False" OnRowDataBound="gvParent_RowDataBound"> 
      <Columns> 
       <asp:BoundField DataField="Name" /> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:HiddenField ID="HdnID" runat="server" Value='<%# Eval("ID") %>' /> 
         <asp:GridView ID="gvChild" DataKeyNames="ID" runat="server" AutoGenerateColumns="false" 
          ShowHeader="false" OnRowDataBound="gvChild_RowDataBound"> 
          <Columns> 
           <asp:BoundField DataField="Name" /> 
          </Columns> 
         </asp:GridView> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

код за

protected void gvParent_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      GridView gvChild = (GridView)e.Row.FindControl("gvChild"); 
      gvChild.DataSource = GetData(); 
      gvChild.DataBind(); 
     } 
    } 

    protected void gvChild_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      string ID = ((HiddenField)e.Row.Parent.Parent.Parent.FindControl("HdnID")).Value; 
     } 
    } 
+1

:) избили меня до него – fenix2222

+1

:) всего через несколько секунд. – yogi

4

Я не думаю, что вы будете в состоянии отследить это нормально, но я бы встраивать ID поле в скрытое поле и поместите это скрытое поле под TemplateField,

<ItemTemplate> 
    <asp:HiddenField ID="idOfYourHiddenField" runat="server" Value='<%# Eval("ID") %>' />  
    <asp:GridView ID="gvChild" DataKeyNames="ID" runat="server" AutoGenerateColumns="false" ShowHeader="false" OnRowDataBound="gvChild_RowDataBound">     
     <Columns>      
      <asp:BoundField DataField="Name" />           
     </Columns>     
    </asp:GridView>    
</ItemTemplate> 

таким образом, вы можете получить его значение, перейдя

gvChild.Parent.FindControl("idOfYourHiddenField"); 
2

Вы можете получить доступ к Родитель Детской Gridview с Родитель собственности. Вы должны быть Попробуйте:

GridView gvChild = (GridView)e.Row.FindControl("gvChild"); 
    Response.Write(gvChild.Parent); 
2

Вы должны пройти 4 шага назад и получить родительскую строку как этот

protected void gvChild_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       GridViewRow gvMasterRow = (GridViewRow)e.Row.Parent.Parent.Parent.Parent; 
      } 
     } 
0
<asp:GridView ID="gvParent" DataKeyNames="ID" runat="server" PageSize="1" AllowPaging="true" 
PagerSettings-Mode="NextPrevious" AutoGenerateColumns="False" SkinID="GVCenter" 
OnRowDataBound="gvParent_RowDataBound"> 
<Columns> 
    <asp:BoundField DataField="Name" /> 
    <asp:TemplateField> 
     <ItemTemplate> 
      <asp:GridView ID="gvChild" DataKeyNames="ID" runat="server" AutoGenerateColumns="false" 
       ShowHeader="false" OnRowDataBound="gvChild_RowDataBound"> 
       <Columns> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <%# (((IDataItemContainer)Container.Parent.Parent.Parent).DataItem as MyClass).MyProperty %> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
      </asp:GridView> 
     </ItemTemplate> 
    </asp:TemplateField> 
</Columns>