嵌套Grid,光棍月大放送,不藏着掖着。實在寫的不好,沒臉藏啊~只考慮顯示排序修改什么的都不管!
話說三石官網加實例了,http://fineui.com/demo/#/demo/grid/grid_rowexpander_grid.aspx 是用extjs寫的,我寫的啰嗦點
          擴展行是咋出來的,我着實沒看懂,但是要實現效果也有方法,先想一下, 
        
 
        
          1.嵌套的Grid數據應該是動態的,我只知道在后頭綁,事件是前台觸發的,那就是把ID傳后台就行了。 
        
 
        
          2.一個下拉生成一個Grid,后台生成到前台我不會,前台用ExtJs生成太復雜,要寫好多的ExtJs原生。 
        
 
        
          3.結合以上兩點大概代碼是這樣的,前台觸發ID傳到后台,后台綁定數據,在前台復制現成的控件,顯示。 
        
 
         
         
        
          開始 
        
 
        
          1.先准備個grid,就不寫了,准備行擴展列 
        
 
                    <f:TemplateField ColumnID="griditem" Hidden="true" RenderAsRowExpander="true">
                <ItemTemplate>
                    <div runat="server" id="divItem" class="expander">
                    </div>
                </ItemTemplate>
            </f:TemplateField>
 
         
           在每行展開的時候把擴展的grid復制到id=divitem里就可以了。 
         
 
         
           2.觸發事件 
         
 
         
           API里真沒找見,在網上找到的,拿過來可以用, 
         
 
                     F('<% =Grid1.ClientID%>').view.on('expandBody', function (rowNode, record, expandRow, eOpts) {
                //傳到后台,參數為行ID,行綁定的數據ID
                F.customEvent('GridItem_' + rowNode.id + '_' + record.get('ItemId'));
            });
 
          
            3.准備個擴展的Grid 
          
 
          
            正常些就可以,我放在了Panel里。JQ是為了控制Grid2的樣式。 
          
 
              <f:Panel runat="server" ID="PanelGrid1" Height="0px" Hidden="false">
        <Items>
            <f:Grid ID="Grid2" Width="200px" runat="server" ShowBorder="false" ShowGridHeader="true"
                ShowHeader="false" AllowColumnLocking="True">
                <Columns>
                    <f:TemplateField Width="60px" HeaderText="序號">
                        <ItemTemplate>
                            <asp:Label runat="server" Text='<%# Container.DataItemIndex + 1 %>'></asp:Label>
                        </ItemTemplate>
                    </f:TemplateField>
                    <f:BoundField runat="server" HeaderText="身高" DataField="ShenGao" />
                    <f:BoundField runat="server" HeaderText="體重" DataField="TiZhong" />
                    <f:BoundField runat="server" HeaderText="血壓低" DataField="XueYaDi" />
                    <f:BoundField runat="server" HeaderText="血壓高" DataField="XueYaGao" />
                </Columns>
            </f:Grid>
        </Items>
    </f:Panel>
 
           
        F.ready(function () {
            F('<% =Grid2.ClientID%>').autoWidth = true;
            F('<% =Grid2.ClientID%>').autoHeight = true;
            F('<% =Grid2.ClientID %>').setWidth(F('<% =Grid1.ClientID %>').getWidth() - 100);
        });
 
           
             4.准備復制方法 
           
 
           
             剛才說是前台復制,兩種,一個是extjs可以復制grid2元素然后顯示到指定位置,沒試出來,實在沒時間會。 
           
 
           
             第二個方法就是整個過程的核心也是最偷懶的地方,直接復制HTML,復制HTML最大的問題是ID,兩個ID一樣了EXTJS會亂的,好在他只認一個,我把PanelGrid1放在了Grid1 的上面,后台找到的Grid2就是Panel里的了;復制HTML還會復制Grid2 的所有屬性,如果Grid2.Hidden=Ture那也復制過去了,不顯示了,所以PanelGrid1的Height=0,就是隱藏的意思。 
           
 
           
             另一個重要的就是獲取了,要把HTML復制用JQ找到來源和目標,直接上代碼,大家不用找了 
           
 
                   function showgirdItme(rowid) {
            //選擇行隱藏列的ID,rowid來自后台
            var itemid = $('#' + rowid).find('div .expander').attr('id');
            //復制的HTML
            $('#' + itemid).html($('#<% =PanelGrid1.ClientID %>-innerCt').html());
        }
 
            
              手動觸發showgirdItme正常,rowid哪來的,在事件里獲到的。 
            
 
            
              還有一個關閉事件,仍掉復制的東西,省着占地, 
            
 
            
              不要寫錯地方,Sunny就寫錯了 
            
 
            
              下面這段放到F.ready里,放ready外面獲取不到F('<% =Grid1.ClientID%>')的 
            
 
                        F('<% =Grid1.ClientID%>').view.on('collapsebody', function (rowNode, record, expandRow, eOpts) {
                var itemid = $('#' + rowNode.id).find('div .expander').attr('id');
                $('#' + itemid).html('');
            });
 
             
               5.后台 
             
 
             
               觸發了后台方法,把方法打出來 
             
 
             
               Sunny沒看懂; 
             
 
             
               此事件觸發   protected void PageManager1_CustomEvent(object sender, CustomEventArgs e) 所以首先要定義 PageManager1_CustomEvent 事件 
             
 
             
               比如:<f:PageManager ID="PageManager1" AutoSizePanelID="Panel2" OnCustomEvent="PageManager1_CustomEvent" runat="server" /> 
             
 
             
               你們都沒我對她好 
             
 
                         if (e.EventArgument.IndexOf("GridItem_") >= 0)
            {
                string rowid = e.EventArgument.Split('_')[1].ToString();
                string id = e.EventArgument.Split('_')[2].ToString();
                DataTable table = GetDataTable();
                DataRow[] drs = table.Select("Id = '" + id + "'");
                DataTable dt = new DataTable();
                dt = table.Clone();
                foreach (DataRow dr in drs)
                {
                    //模擬數據
                    dt.Rows.Add(dr.ItemArray);
                    dt.Rows.Add(dr.ItemArray);
                    if (Convert.ToInt32(id)>102)
                    {
                        dt.Rows.Add(dr.ItemArray);
                        dt.Rows.Add(dr.ItemArray);
                    }
                }
                //綁定
                Grid2.DataSource = dt;
                Grid2.DataBind();
                //注意延遲方法
                string sc = "window.setTimeout(function () {showgirdItme('" + rowid + "');},100);";
                FineUI.PageContext.RegisterStartupScript(sc);
            }
 
              
                就是獲得數據,綁定,但是看到有setTimeout方法,因為Extjs是延遲加載,他會先執行js然后在綁定,所以只能綁定完了在執行復制,這是個處理的小技巧。 
              
 
              
                沒了,上個圖 
              
 
               
 
              
                 還要注意嵌套的Grid點不了,因為一點就是選擇的Grid1的行,應該是樣式就可以調,不弄了,我也用不上。源碼,看吧,有心情就弄,沒有自己沾吧 
               
 
               
                 這玩應也有臉拿出來也算第一人了,偷懶了,等成熟了(我會了)再完善吧。 
               
 
               
                 本來不想放源碼着 
                CSDN資源10分 
               
 
               
