2009-06-29 4 views
0

Я использую ASP.NET с C# и дозвуковой. Я пытаюсь настроить поиск по текстовому полю по имени и фамилии.База данных поиска по имени и фамилии

First or Last Name: <asp:TextBox ID="txtSearchName" runat="server"></asp:TextBox> 
<asp:linkButton runat="server" Text="Send" onclick="btnSubmit_Click" /> 
    <asp:GridView 
    border="0" 
    cellpadding="3" 
    cellspacing="3" 
    ShowHeader="True" 
    allowsorting="true" 
    ID="GridView1" 
    runat="server" 
    AutoGenerateColumns="false" 
    Visible="false" 
    AllowPaging="True" 
    PageSize="10" 
    PagerStyle-Mode="NumericPages" 
    OnPageIndexChanging="GridView1_PageIndexChanging" 
    > 

В коде позади, у меня есть это:

private void BuildGridView1() 
    { 
     GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*") 
       .From(PastAwardName.Schema) 
       .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID) 
       .Where(PastAwardName.Columns.LName).IsEqualTo(this.txtSearchName.Text) 
       .Or(PastAwardName.Columns.FName).IsEqualTo(this.txtSearchName.Text) 
       .OrderAsc(PastAwardType.Columns.AwardYear) 
       .ExecuteDataSet(); 

    } 

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    BuildGridView1(); 
    GridView1.PageIndex = e.NewPageIndex; 
    GridView1.DataBind(); 
} 

Это работает, если вы вводите либо имя или фамилию, но я хочу, чтобы иметь возможность искать их обоих в то же самое время из одного текстового поля. Это возможно?

ответ

1

Split содержание this.txtSearchName.Text, если он содержит одно слово использовать исходный запрос, если он содержит два слова, а затем использовать модифицированную версию вашего запроса:

private void BuildGridView1() 
    { 
     string[] names = String.Split(this.txtSearchName.Text, ' '); 
     if (names.length == 1) { 
      GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*") 
       .From(PastAwardName.Schema) 
       .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID) 
       .Where(PastAwardName.Columns.LName).IsEqualTo(names[0]) 
       .Or(PastAwardName.Columns.FName).IsEqualTo(names[0]) 
       .OrderAsc(PastAwardType.Columns.AwardYear) 
       .ExecuteDataSet(); 
     } 
     else if (names.Length == 2) { 
      GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*") 
       .From(PastAwardName.Schema) 
       .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID) 
       .Where(PastAwardName.Columns.LName).IsEqualTo(names[1]) 
       .And(PastAwardName.Columns.FName).IsEqualTo(names[0]) 
       .OrderAsc(PastAwardType.Columns.AwardYear) 
       .ExecuteDataSet(); 
     } 
    } 

Вы, вероятно, также хочу добавить обработку/проверку ошибок для случая, когда пользователь не вводит значение в текстовое поле или не вводит 3 или более слов.

2

Вы должны иметь возможность построить свой запрос, а затем добавить ограничения Or/And в зависимости от того, есть ли у вас несколько имен. Следующее должно работать, но вы должны знать, что краевые случаи, такие как имена с двойным овалом, пользователь, вводящий среднее имя и т. Д., Поймают вас:

private void BuildGridView1() 
{ 
    string[] names = this.txtSearchName.Text.Split(" ".ToCharArray()); 

    SqlQuery query = DB.Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*") 
    .From(PastAwardName.Schema) 
    .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID) 
    .Where(PastAwardName.Columns.FName).IsEqualTo(names[0]) 

    if(names.Length > 1) 
    query = query.And(PastAwardName.Columns.LName).IsEqualTo(names[1]) 
    else 
    query = query.Or(PastAwardName.Columns.LName).IsEqualTo(names[0] 

    GridView1.DataSource = query.OrderAsc(PastAwardType.Columns.AwardYear) 
    .ExecuteDataSet(); 
} 
+0

Спасибо за ответы! Это имеет смысл, но я получаю следующую ошибку: Сообщение об ошибке компилятора: CS0650: Неверный идентификатор массива: для объявления управляемого массива спецификатор рангов предшествует идентификатору переменной. Чтобы объявить поле буфера фиксированного размера, используйте ключевое слово fixed до типа поля. Ошибка источника: Строка 55: { Строка 56: Строка 57: имена строк [] = String.Split (this.txtSearchName.Text, ""); – Brett

+0

Ах да, ошибка в использовании метода split. Теперь это исправлено. –

+0

Я изменил строку ниже, но все равно получаю ту же ошибку ... имена строк [] = this.txtSearchName.Text.Split ("" .ToCharArray()); – Brett

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