【问题标题】:showing parent/child records in asp.net gridview在 asp.net gridview 中显示父/子记录
【发布时间】:2011-11-09 19:34:46
【问题描述】:

好的,我似乎无法弄清楚这一点..我有 1 个表,其列 id 为 parentid 这允许一个选项有一个子选项。所以它会是这样的:

id  |  parentid
1   |    null
2   |    null
3   |      1 

我需要它在我的网格视图中显示是这样的:

id  |  parentid
 1  |     null
 3  |      1
 2  |     null

任何想法我都会非常感激......并且以防万一我在选择上搜索并尝试了 Sql COALESCE 但也没有用......

【问题讨论】:

  • 我认为这里没有足够的信息来以任何有意义的方式回答您的问题。您的“外观应该如何”选项似乎仅将数据居中并交换项目 2 和 3 的位置。该顺序是如何确定的?

标签: asp.net sql gridview parent-child


【解决方案1】:

我会使用 ListView 或 DataList 而不是 GridView。这应该会让你走上正确的道路:

<table width="595px">
    <asp:DataList BackColor="#ffffff" id="DataList1" DataKeyField="<ID>" OnItemDataBound="DataList1_ItemDataBound" runat="server" Width="100%">     
        <ItemTemplate>
           <tr>
              <td>
                  <asp:LinkButton ID="LinkButton1" runat="server" Text="+" OnCommand="LinkButton1_Command" CommandArgument='<%#Container.ItemIndex%>'></asp:LinkButton>    
              </td>
              <td><%#Eval("<COLUMN NAME>")%></td>
              <td><%#Eval("<COLUMN NAME>")%></td>
              <td><%#Eval("<COLUMN NAME>")%></td>
           </tr>
           <asp:PlaceHolder ID="plcChildView" runat="server">
               <asp:DataList ID="DataList2" runat="server" Width="100%">
                   <ItemTemplate>
                       <tr>
                          <td><%#Eval("<CHILD OLUMN NAME>")%></td>
                          <td><%#Eval("<CHILD COLUMN NAME>")%></</td>
                          <td><%#Eval("<CHILD COLUMN NAME>")%></</td>                           
                       </tr>
                   </ItemTemplate>
               </asp:DataList>
           </asp:Panel>
        </ItemTemplate>
    </asp:DataList>
</table>

当用户点击 DataList1 中的 LinkBut​​ton/Button 时,执行如下操作:

protected void LinkButton1_Command(object sender, CommandEventArgs e)
{
    //pass index of item in command argument
    int itemIndex = Convert.ToInt32(e.CommandArgument);      

    //find the pnlChildView control
    PlaceHolder childViewHolder = (PlaceHolder)DataList1.Items[itemIndex].FindControl("plcChildView");
    if (childViewHolder != null)
    {
        //toggle visibility of childViewPanel and bind child list if panel is visible

        if (childViewHolder.Visible)
        {
            DataList childList = childViewHolder.FindControl("DataList2");
            if (childList != null)
            {
                int keyValue = (int)DataList1.DataKeys[itemIndex];

                //bind the list using DataList1 data key value
                childList.DataSource = <DATA SOURCE>; //get data using keyValue
                childList.DataBind();
            }  
        }
    }
}

【讨论】:

  • 感谢这对我有用,但因为他们需要即时处理任何子选项,我们将使用树视图:S 但只是想让您知道这对我真的有用。