Ree
Ree

Reputation: 81

Link button inside nested gridview invoking the wrong row

I have a expand collapse nested grid view like below.

enter image description here

The childgrid (gvChild) column is a linkbutton column on the click of which I need to get the name of the city which was clicked. My rowcommand event to capture that on the child gridview is like this:

protected void gvChild_RowCommand(object sender, GridViewCommandEventArgs e)
{
      if (e.CommandName == "ShowDetails")
            {
                int index = Convert.ToInt32(e.CommandArgument);

                GridView gridChild = (GridView)gvwParent.Rows[index].FindControl("gvChild");

                foreach (GridViewRow row in gridChild .Rows)
                {
                  string aCity= ((LinkButton)row.Cells[1].FindControl("lnkSelectedCity")).Text;
                }
        }
}  

I understand the findcontrol line is def wrong, but how else would I do the findcontrol of the child grid to get the right link button that was clicked? Right now if I select "London", the Index value is 1 and the String "aCity" is taking it as "Utah". Will appreciate inputs on this. Thank you.

Code on my aspx page:

<asp:GridView ID="gvParent" runat="server" 
 AllowPaging="True" AutoGenerateColumns="False" 
   DataKeyNames="CountryID" 
       OnRowDataBound="gvParent_RowDataBound" >     
           <Columns>     
             <asp:TemplateField>        
              <ItemTemplate>        
                 <a href="javaScript:divexpandcollapse('div<%# Eval("CountryID") %>');">
                  <img id='imgdiv<%# Eval("CountryID") %>' width="9px" border="0" src="expand_white.gif"
                                 alt="" /></a>       
              </ItemTemplate>    
             </asp:TemplateField>    
            <asp:TemplateField HeaderText="CountryDesc">
           <ItemTemplate>
<asp:Label ID="lblEmpID" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "CountryDesc") %>'></asp:Label>
             </ItemTemplate>
              </asp:TemplateField>   
                <asp:TemplateField>     
                   <ItemTemplate> 
                      <tr>
                        <td colspan="100%">
                         <div id='div<%# Eval("CountryID") %>' style="display: none; position: relative; left: 15px; overflow: auto">                                  
       <asp:GridView ID="gvChild" runat="server" AutoGenerateColumns="False" PageSize="5"
              Width="100%" Height="270px" ShowHeader="False"   OnRowDataBound="gvChild_RowDataBound">
                    <Columns>
                        <asp:BoundField DataField="CityID" HeaderText="CityID">
                            <HeaderStyle CssClass="Invisible" />
                            <ItemStyle CssClass="Invisible" HorizontalAlign="Left" />
                        </asp:BoundField>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:LinkButton ID="lnkSelectedCity" runat="server" Text='<% # Eval("CityName") %>'
                                    CommandName="ShowDetails" CommandArgument='<%# Container.DataItemIndex %>' ToolTip="Select x"></asp:LinkButton>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="Assigned" HeaderText="Assigned">
                            <HeaderStyle CssClass="Invisible" />
                            <ItemStyle CssClass="Invisible" HorizontalAlign="Left" />
                        </asp:BoundField>
                        <asp:BoundField DataField="CountryID" HeaderText="Assigned">
                            <HeaderStyle CssClass="Invisible" />
                            <ItemStyle CssClass="Invisible" HorizontalAlign="Left" />
                        </asp:BoundField>
                          <asp:BoundField DataField="ClassID" HeaderText="ClassID">
                            <HeaderStyle CssClass="Invisible" />
                            <ItemStyle CssClass="Invisible" HorizontalAlign="Left" />
                        </asp:BoundField>
                         <asp:BoundField DataField="UOM" HeaderText="UOM">
                            <HeaderStyle CssClass="Invisible" />
                            <ItemStyle CssClass="Invisible" HorizontalAlign="Left" />
                        </asp:BoundField>
                        </Columns>
                </asp:GridView>
                </div>     
               </td></tr>
              </ItemTemplate>     
             </asp:TemplateField>     
             </Columns>    
            </asp:GridView>

Upvotes: 0

Views: 2015

Answers (1)

Win
Win

Reputation: 62290

I assume CityID is a unique key. If so, you can assign CityID to CommandArgument.

Then you can retrieve the CityID back from CommandArgument after post back.

<asp:GridView ID="gvChild" ... DataKeyNames="CityID">
  <Columns>
    ...
    <asp:TemplateField>
      <ItemTemplate>
        <asp:LinkButton ID="lnkSelectedCity" 
           ...
           CommandArgument='<%# Eval("CityID") %>' 
           ToolTip="Select x" />
      </ItemTemplate>
    </asp:TemplateField>

protected void gvChild_RowCommand(object sender, GridViewCommandEventArgs e)
{
  if (e.CommandName == "ShowDetails")
  {
    int cityId = Convert.ToInt32(e.CommandArgument);
  }  
}  

Upvotes: 0

Related Questions