2009-06-29 61 views
0

我正在使用C#和亚音速的ASP.NET。 我正在尝试通过名字和姓氏在文本字段上设置搜索。按名和姓搜索数据库

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

斯普利特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限制。以下应工作,但你应该知道,边缘情况下,像双barelled名,进入了一个中间名等,用户会发现破绽:

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 2009-06-29 16:16:38