2009-06-29 10 views
0

Ich benutze ASP.NET mit C# und Subsonic. Ich versuche eine Suche in einem Textfeld nach Vor- und Nachnamen einzurichten.Suchdatenbank nach Vor- und Nachname

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" 
    > 

In der Code-behind, ich habe dies:

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(); 
} 

Dies funktioniert, wenn Sie entweder den Vor- oder Nachnamen eingeben, aber ich will für sie beide zugleich suchen können aus einem Textfeld. Ist das möglich?

Antwort

1

Split der Inhalt this.txtSearchName.Text, wenn es enthält ein Wort Ihre ursprüngliche Abfrage verwenden, wenn es zwei Worte enthält, dann eine modifizierte Version der Abfrage verwenden:

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(); 
     } 
    } 

Sie werden wahrscheinlich Außerdem möchten Sie eine Fehlerbehandlung/Validierung für den Fall hinzufügen, wenn der Benutzer keinen Wert in das Textfeld eingibt oder 3 oder mehr Wörter eingibt.

2

Sie sollten in der Lage sein, Ihre Abfrage zu erstellen und dann die Or/And-Einschränkungen abhängig davon, ob Sie mehr als einen Namen haben, anhängen. Folgendes sollte funktionieren, aber Sie sollten sich bewusst sein, dass Grenzfälle wie doppel barelled Namen, ein Benutzer einen mittleren Namen usw. eingeben werden Sie ertappen:

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

Danke für die Antworten! Das ergibt Sinn, aber ich erhalte den folgenden Fehler: Compiler-Fehlermeldung: CS0650: Fehlerhafter Array-Deklarator: Um ein verwaltetes Array zu deklarieren, ist der Rangbezeichner dem Bezeichner der Variablen vorangestellt. Um ein Pufferfeld fester Größe zu deklarieren, verwenden Sie das Schlüsselwort fixed vor dem Feldtyp. Quellfehler: Zeile 55: { Zeile 56: Zeile 57: Zeichenfolge-Namen [] = String.Split (this.txtSearchName.Text, ""); – Brett

+0

Ah ja, Fehler bei der Verwendung der Split-Methode. Es ist jetzt behoben. –

+0

Ich habe die folgende Zeile geändert, bekomme aber immer noch den gleichen Fehler ... String-Namen [] = this.txtSearchName.Text.Split ("" .ToCharArray()); – Brett

Verwandte Themen