ASP.NET-FineUI開發實踐-10


嵌套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分

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM