2011-09-08 38 views
1

我創建了一個CAML查詢來獲取列表上的一些特定項目,包含OR:的Sharepoint SPQuery上SPView問題

<Or> 
    <Eq><FieldRef Name='Title'/><Value Type='Text'>tileA</Value></Eq> 
    <Eq><FieldRef Name='Title'/><Value Type='Text'>titleB</Value></Eq> 
</Or> 

現在查詢工作正常,如果我把它傳遞給list.GetItems()梅託德,但是當我使用它像它不起作用:

SPContext.Current.List.DefaultView.Query = myStringQuery; 
SPContext.Current.List.DefaultView.Update(); 

我將代碼放在一個web部件(的Page_Load()),被添加到列表中,代碼執行,但視圖保持未過濾。任何人都知道可能是什麼原因?

回答

2

兩件事情:

首先,確保你的CAML被包裹在其中的元素:

<Where> 
    <Or> 
     <Eq><FieldRef Name='Title'/><Value Type='Text'>tileA</Value></Eq> 
     <Eq><FieldRef Name='Title'/><Value Type='Text'>titleB</Value></Eq> 
    </Or> 
</Where> 

二,重新安排你的代碼是這樣的:

SPView view = SPContext.Current.List.DefaultView; 
view.Query = myStringQuery; 
view.Update(); 

我知道代碼塊看起來相同,但SPContextDefaultView都不使用私有字段。例如,這裏是DefaultView實現:

SPContext.Current.List.DefaultView.Query = myStringQuery; 
SPContext.Current.List.DefaultView.Update(); 

第一行設置的DefaultView實例的Query財產而第二行中的一個新的實例調用Update

internal SPView DefaultView 
{ 
    get 
    { 
    if (this.m_iDefaultViewIndex == -1) 
     return (SPView) null; 
    else 
     return this[this.m_iDefaultViewIndex]; 
    } 
} 

public SPView this[int iIndex] 
{ 
    get 
    { 
    if (iIndex < 0 || iIndex >= this.Count) 
     throw new ArgumentOutOfRangeException(); 
    else 
     return new SPView(this, this.m_arrViewSchema, iIndex); 
    } 
} 

所以DefaultView

+0

至於CAML查詢你是對的,但查詢被封裝在,只是忘了在這裏添加它,因爲我沒有訪問我的原始代碼atm。當我在工作 – matt137

+0

測試它時,我會給你一個關於你的解決方案如何工作的反饋,感謝關於DefaultView的信息,我一直想知道爲什麼會發生這種情況...... – int32

+0

顯然它只有當我做這樣的事情時纔有效: 'SPSite site = SPContext.Current.Site;'然後 '使用(SPWeb web = site.RootWeb){var currentView = web.Lists [「myList」]。DefaultView;'但是,我需要刷新瀏覽器中的列表以查看更改(我甚至將代碼移到了Web部件上的OnInit()),所以它仍然遠沒有完美,但是您的解決方案導致了正確的路徑,謝謝! – matt137