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