2012-01-15 3 views
-1

Итак, моя проблема в том, что мои знания о CAML и Sharepoint очень бедны.Поиск SPQuery не работает с «BeginsWith»

Вопрос: Мне нужен SPQuery для построения запроса поиска, текста поиска у меня есть из текстового поля. Я ожидаю, что мой запрос вернет мне товар (например, я набираю текстовое поле «Джо», и запрос возвращает мне все элементы с фамилией «Джонсон» или имя «Джон» и т. Д.)

1) Работы TextChanged ОК. Я проверяю это, есть нормально 2) SPGridView просматривает элементы ok. Элементы из SPList Я добавляю в gridView - есть viewd по gridview. 3) Но мой запрос не работает. Пожалуйста, помогите со ссылками/советует

public class VisualWebPart1 : WebPart 
{ 
    SPSite site; 
    SPWeb web; 
    SPGridView gridView; 
    SPDataSource dataSource; 
    TextBox searchTextBox; 
    UpdatePanel panel; 
    SPList list; 
    SPList resultList; 

    string currentList; 
    // Visual Studio might automatically update this path when you change the Visual Web Part project item. 
    private const string _ascxPath = @"~/_CONTROLTEMPLATES/CRMSearchWebPart/VisualWebPart1/VisualWebPart1UserControl.ascx"; 

    protected override void CreateChildControls() 
    { 
     gridView = new SPGridView(); 
     searchTextBox = new TextBox(); 
     panel = new UpdatePanel(); 

     searchTextBox.AutoPostBack = true; 
     searchTextBox.Visible = true; 
     searchTextBox.Enabled = true; 
     searchTextBox.TextChanged += new EventHandler(searchTextBox_TextChanged); 

     gridView.Visible = true; 
     gridView.Enabled = true; 
     gridView.AutoGenerateColumns = false; 
     AddColumnToSPGridView("Surname", "Surname"); 

     panel.UpdateMode = UpdatePanelUpdateMode.Conditional; 
     panel.ContentTemplateContainer.Controls.Add(searchTextBox); 
     panel.ContentTemplateContainer.Controls.Add(gridView); 


     Control control = Page.LoadControl(_ascxPath); 
     Controls.Add(control); 

     Controls.Add(panel); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     panel.RenderControl(writer); 
    } 

    //Open WebSite with List "listName" 
    private void OpenWebSite(string listName) 
    { 
     site = SPContext.Current.Site; 
     web = site.OpenWeb(); 
     list = web.Lists[listName]; 
    } 

    //Add Column to gridView 
    private void AddColumnToSPGridView(string HeaderText, string Datafield) 
    { 
     SPBoundField boundField = new SPBoundField(); 
     boundField.HeaderText = HeaderText; 
     boundField.DataField = Datafield; 
     gridView.Columns.Add(boundField); 
    } 

    //Build query for search; fieldName - Name of column of current List, searchQuery - our query 
    private string BuildQuery(string fieldRefName, string searchQuery) 
    { 
     string query = ""; 
     switch (fieldRefName) 
     { 
      case "Surname": 
       query = "<Where><BeginsWith><FieldRef Name='Surname'/>" + 
      "<Value Type=Text>"+searchQuery+"</Value></BeginsWith></Where>"; 
       break; 
      case "Name": 
       query = query = "<Where><BeginsWith><FieldRef Name='Name'/>" + 
      "<Value Type=Text>"+searchQuery+"</Value></BeginsWith></Where>"; 
       break; 
      case "PassportNumber": 
       query = "<Where><BeginsWith><FieldRef Name='PassportNumber'/>" + 
      "<Value Type=Text>"+searchQuery+"</Value></BeginsWith></Where>"; 
       break; 
      default: break; 
     } 
     return query; 
    } 

    // search in List for selected items and returns SPGridView 
    private void searchTextBox_TextChanged(object sender, EventArgs e) 
    { 
     dataSource = new SPDataSource(); 
     string querySearch = searchTextBox.Text; 

     OpenWebSite("Surnames"); 

     string query = BuildQuery("Surname", querySearch); 
     SPQuery spQuery = new SPQuery(); 
     spQuery.ViewFields = "<FieldRef Name = 'Title'/><FieldRef Name = 'Surname'/><FieldRef Name = 'Name'/>"; 
     spQuery.Query = query; 

     SPListItemCollection items = list.GetItems(query); 
     foreach (SPListItem item in items) 
     { 
      searchTextBox.Text += item["Surname"] + " "; 
     } 

     //resultList = web.Lists["TempSurnames"]; 
     //resultList = AddItemsToSPList(resultList, items); 
     BindDataSource(dataSource, resultList); 
     //resultList = AddSPList("Result2", "Result list"); 
     //resultList = AddItemsToSPList(resultList, items); 
     list = AddItemsToSPList(list, items); 
     //BindDataSource(dataSource, resultList); 
     BindDataSource(dataSource, list); 
     BindGridView(gridView, dataSource); 

     //var item = list.Items[3]; 
     //var item = resultList.Items[1]; 
     //searchTextBox.Text = item["Surname"].ToString(); 
     //resultList.Delete(); 
    } 

    //Binds datasource of existing gridView with SPDataSource 
    private void BindGridView(SPGridView gridview, SPDataSource datasource) 
    { 
     gridview.DataSource = datasource; 
     gridview.DataBind(); 
    } 

    //Add SPListItem items to SPList 
    private SPList AddItemsToSPList(SPList spList, SPListItemCollection collection) 
    { 
     foreach (SPListItem item in collection) 
     { 
      var listItem = spList.AddItem(); 
      listItem = item; 
     } 
     return spList; 
    } 

    //Binds existing SPDataSource to SPList 
    private void BindDataSource(SPDataSource spDataSource, SPList spList) 
    { 
     spDataSource.List = spList; 
    } 

    private SPList AddSPList(string listName, string listDescription) 
    { 
     OpenWebSite("Surnames"); 
     SPListCollection collection = web.Lists; 
     collection.Add(listName, listDescription, SPListTemplateType.CustomGrid); 
     resultList = web.Lists[listName]; 
     return resultList; 
    } 

Update:

Эта часть дает мне ошибку:

SPListItemCollection items = list.GetItems(query); 
foreach (SPListItem item in items) 
{ 
    searchTextBox.Text += item["Surname"] + " "; 
} 

System.ArgumentException: Value does not fall within the expected range

ответ

0

Вы должны включить поле Фамилия в поле зрения полей запроса:

SPQuery query = // ... 
query.ViewFields = "<FieldRef Name='Surname' />"; 
// ... 

Вы можете понять вид поля, такие как SELECT часть запроса SQL.

+0

уже есть) spQuery.ViewFields = "", но все равно не удастся – Viaches

+0

@Viaches, тогда вы должны, возможно, опубликовать весь свой код! – Stefan

+0

Извините, это моя ошибка ... Обновить мой код. – Viaches

0

Есть ли у вас отлажен код, чтобы проверить строку запроса, генерируется? Кроме того, у вас есть query = query = под переключателем Name.

Кроме того, вы знаете, что переключатель чувствителен к регистру, поэтому убедитесь, что вы правильно указали свой параметр searchQuery.

+0

Да, я отлаживал код ниже (просто хочу проверить запрос mu): SPListItemCollection items = list.GetItems (query); foreach (SPListItem item in items) { searchTextBox.Text + = item ["Surname"] + ""; } И у меня есть ошибка: System.ArgumentException: Значение не входит в ожидаемый диапазон. – Viaches

+0

Хорошо, Не могли бы вы провести тест и приложить отладчик. Перед ошибкой извлеките запрос строковой переменной и покажите ее мне. Кроме того, определите, будет ли он разбиваться на строку list.GetItems (query) или foreach. –

+0

Итак, это мой запрос: Pet и нет, это не нарушение на GetItems – Viaches

 Смежные вопросы

  • Нет связанных вопросов^_^