本文介紹兩種為列表視圖設置時間段篩選器的方法。其中,第一個方法用于SharePoint Server,第二個方法同時還能用于SharePoint Foundation。
方法一:日期篩選器Web部件
先看一下接下來要用的列表,是一個任務列表:
為了實驗方便,我們先建個頁面,用來放置目標列表視圖和篩選器。
1、打開SPD,選擇左側的“網站頁面”,點擊功能區里的“新建”->"Web部件頁"。
如果是已有頁面,則右鍵高級模式編輯。
2、找到頁面主要區域的WebPart Zone,在其中的ZoneTemplate里插入光標。
選擇插入,數據視圖。插入目標列表。
3、在列表視圖工具中,選擇“篩選、排序和分組”中的“參數”。
新建兩個參數。參數源設為默認的無就可以。
4、然后,同樣使用功能區上的按鈕,為列表視圖設置篩選條件。使列表視圖顯示大于等于[StartDate]并且小于等于[EndDate]的項。
5、在該視圖webpart上方,插入兩個“日期篩選器”WebPart。
6、保存該頁面。然后點擊功能區的“在瀏覽器中預覽”按鈕。
7、進入頁面編輯模式。選擇第一個日期篩選器,在WebPart屬性中設置篩選器名稱,默認值。
再設置第二個。
8、接下來進行關聯。選擇第一個日期篩選器,選擇WebPart連接,篩選值發送位置。發送到下面的列表視圖。這里就是TaskDemo了。
9、在彈出窗口中選擇連接類型為參數獲取位置。點擊“配置”按鈕。
10、選擇接收方對應的參數名稱,這里為StartDate
11、完成后的設計視圖是這個樣子。
12、用同樣的方式設置第二個日期篩選器的連接。連到EndDate參數。
13、完成后退出頁面的設計模式。
測試結果:
方法二:控件傳參
這種方法是用我們自己擺放的控件來進行日期的輸入。相對來說自由度會高一些,當然難度也稍有增加。
1、首先也是頁面和列表視圖的準備工作。請參考方法一的第一步和第二步。
2、在視圖WebPart所在的WebPartZone外面,插入光標:
插入如下table和控件:
<table class="ms-formtable" style="margin-top: 8px;" border="0" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="113" class="ms-formlabel" nowrap="true" valign="top"><h3 class="ms-standardheader"> <nobr>開始時間:<span title="這是必填字段。" class="ms-accentText"> *</span></nobr> </h3></td> <td width="350" class="ms-formbody" valign="top"> <span dir="none"><asp:Textbox ID="scStartTextbox" runat="server" CssClass="ms-hide"></asp:Textbox> <SharePoint:DateTimeControl runat="server" DateOnly="true" ID="scStart" DatePickerFrameUrl="../_layouts/iframe.aspx" /> <br/></span> </td> </tr> <tr> <td width="113" class="ms-formlabel" nowrap="true" valign="top"><h3 class="ms-standardheader"> <nobr>結束時間:<span title="這是必填字段。" class="ms-accentText"> *</span></nobr> </h3></td> <td width="350" class="ms-formbody" valign="top"> <span dir="none"><asp:Textbox ID="scEndTextbox" runat="server" CssClass="ms-hide"></asp:Textbox> <SharePoint:DateTimeControl runat="server" DateOnly="true" ID="scEnd" DatePickerFrameUrl="../_layouts/iframe.aspx" /> <br/></span> </td> </tr> <tr><td colspan="2"> <asp:Button runat="server" ID="btnSearch" Text="查詢" OnClientClick="javascript:SetStartEndDate()"/> </td></tr> </tbody> </table>
重點是用SharePoint DateTimeControl來方便日期輸入,和用隱藏的ASP.NET TextBox來存放控件值。ASP.NET Button用于頁面提交。同時,通過js把DateTimeControl的日期值填寫到相應的TextBox里。之所以這么繞一下,是因為下面的視圖WebPart接參時,無法直接從DateTimeControl這類的控件直接Get到Value。而TextBox可以。展示效果如下:
當然,本例用的是控件值類型的參數。我們也可以用查詢字符串類型的參數,把值拼到URL后面(參見霖雨的這篇博文)。
3、在PlaceHolderAdditionalPageHead部分,先插入jquery.js的引用,再插入我們的js代碼:
代碼如下:
<script src="../_layouts/15/js/jquery.js" type="text/javascript"></script> <script type="text/javascript"> String.prototype.replaceAll=function(str1,str2){ var regS=new RegExp(str1,"gi"); return this.replace(regS,str2); } function SetStartEndDate(name) { var startstr="scStart"; var endstr="scEnd"; var selectedStartDate=$("input[id][name$='"+startstr+"Date']").val(); selectedStartDate=selectedStartDate.replaceAll("/","-"); $("input[id][name$='"+startstr+"Textbox']").val(selectedStartDate); var selectedEndDate=$("input[id][name$='"+endstr+"Date']").val(); selectedEndDate=selectedEndDate.replaceAll("/","-"); $("input[id][name$='"+endstr+"Textbox']").val(selectedEndDate); } </script>
4、同樣,也要給視圖WebPart設置參數和篩選。這里參數的來源選擇控件,控件ID為上面的TextBox的ID。篩選條件類似。步驟參考方法一的第3,4步。這里就直接上圖了。
5、保存該頁面。然后點擊功能區的“在瀏覽器中預覽”按鈕。輸入一個時間段,點擊查詢來驗證結果。篩選的結果也和第一種類似,就不再贅述了。
--------2016/4/13更新---------
kevin_k_wang反饋說第二種方法做到最后沒有結果。所以我重新測試了一下。發現目前版本確實有問題。
如果你也有類似問題,可以嘗試如下的解決辦法:
1、在SPD里點擊視圖部分的代碼,在頂部的功能區里可以看到列表視圖工具:
2、從設計選項卡里找到自定義XSLT,點擊自定義整個視圖。
3、SPD會自動生成很多代碼。保存。再測試一下是否有結果了。
到這里,很多人可能已經成功看到結果了。
(原因未知,猜測與SharePoint補丁版本有關)
如果還是不行,繼續下面的步驟:
1、在SPD頁面上,隨便找一個html的結束標記(當然,其他結束標記也行,比如CAML標記,XML標記,只要不產生歧義報錯就行)。我找了</table>標記,在后面加一個空格。
2、保存頁面。再測試一下是否有結果了。
所加的空格沒什么實際用處。解決問題后可以再刪掉。保存。同樣可以看到結果。
(原因未知,猜測為SPD的bug。)
另:
附上一份代碼,用來替換方法二中的第2,3步驟里的復雜table和js。如果只是測試控件過濾,用這個簡單版本就夠了。
<asp:Textbox ID="scStartTextbox" runat="server" Text="2015-01-01" ></asp:Textbox> <asp:Textbox ID="scEndTextbox" runat="server" Text="2016-04-13" ></asp:Textbox> <asp:Button runat="server" ID="btnSearch" Text="查詢"/>
參考資料
SharePoint: List filtering by date range
文章列表
留言列表