2011-10-24 47 views
1

使用LinqDataSource讀取簡單表。表名是ZipCode,具有三列:ZipCode,City,State)。讀取工作正常,沒有過濾器,但是當我添加「去哪兒」參數的LinqDataSource,它在GridView數據綁定失敗,出現錯誤,「無屬性或字段‘CityValue郵編‘’在類型存在’。在代碼後面添加LinqDataSource參數

ASPX :

<asp:GridView ID="grdLDS" runat="server" AllowPaging="True" AllowSorting="True" 
    DataSourceID="ldsData" AutoGenerateColumns="False" > 
    <Columns> 
     <asp:BoundField DataField="ZIPCODE1" HeaderText="ZipCode" SortExpression="ZIPCODE1" /> 
     <asp:BoundField DataField="CITY" HeaderText="City" SortExpression="CITY" /> 
     <asp:BoundField DataField="STATE" HeaderText="State" SortExpression="STATE" /> 
    </Columns> 
</asp:GridView> 
<asp:LinqDataSource ID="ldsData" runat="server" ContextTypeName="LinqLayer.CommonDataDataContext" 
     TableName="ZipCodes" OnSelecting="ldsData_Selecting" OnSelected="ldsData_Selected" > 
</asp:LinqDataSource> 

代碼隱藏:

protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    if (!cbxLDS.Checked) 
    { 
     e.Cancel = true; 
     return; 
    } 

    ldsData.WhereParameters.Clear(); 
    StringBuilder where = new StringBuilder(); 
    if (!string.IsNullOrEmpty(txtFilterByZip.Text)) 
    { 
     where.Append("ZIPCODE1.StartsWith(@ZipValue)"); 
     ldsData.WhereParameters.Add("@ZipValue", txtFilterByZip.Text); 
    } 
    if (!string.IsNullOrEmpty(txtFilterByCity.Text)) 
    { 
     if (where.Length > 0) where.Append(" & "); 
     where.Append("CITY.StartsWith(@CityValue)"); 
     ldsData.WhereParameters.Add("@CityValue", txtFilterByCity.Text); 
    } 

    if (!string.IsNullOrEmpty(txtFilterByState.Text)) 
    { 
     if (where.Length > 0) where.Append(" & "); 
     where.Append("STATE.StartsWith(@StateValue)"); 
     ldsData.WhereParameters.Add("@StateValue", txtFilterByState.Text); 
    } 

    ldsData.Where = where.ToString(); 
} 

protected void ldsData_Selected(object sender, LinqDataSourceStatusEventArgs e) 
{ 
    LDSRowCount = e.TotalRowCount; 
} 

private int RefreshLDSData() 
{ 
    grdLDS.DataBind(); // <== CODE FAILS ON THIS LINE 
    return LDSRowCount;  
} 

private IEnumerable<ZipCode> FilterLDSData(IEnumerable<ZipCode> rows) 
{ 
    return rows; 
} 

回答

0

感謝安迪·羅賓遜,這裏是解決方案:

protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
    { 
     if (!cbxLDS.Checked) 
     { 
      e.Cancel = true; 
      return; 
     } 
     var dc = new CommonDataDataContext(); 
     var query = dc.ZipCodes.Select(r => new ZipData() 
     { 
      ZipCode = r.ZIPCODE1, 
      City = r.CITY, 
      State = r.STATE, 
     }); 

     e.Result = ldsFilter(query); 
    } 

    private IQueryable<ZipData> ldsFilter(IQueryable<ZipData> rows) 
    { 
     if (!string.IsNullOrEmpty(txtFilterByZip.Text)) 
     { 
      rows = rows.Where(r => r.ZipCode.StartsWith(txtFilterByZip.Text)); 
     } 

     if (!string.IsNullOrEmpty(txtFilterByCity.Text)) 
     { 
      rows = rows.Where(r => r.City.StartsWith(txtFilterByCity.Text)); 
     } 

     if (!string.IsNullOrEmpty(txtFilterByState.Text)) 
     { 
      rows = rows.Where(r => r.State.StartsWith(txtFilterByState.Text)); 
     } 

     return rows; 
    } 

lds_Data_Selecting事件提供查詢的結構,ldsFilter方法進行動態過濾。此方法必須接受並返回一個iQueryable。

0

你可以嘗試像這樣在與使用LinqDataSource參數..

注意:這僅僅是例子,如何使用使用的LinqDataSource這裏參數...

public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    var db = new MyDataContext()) 
    var subjectFilter = e.WhereParameters("Subject"); 
    var reporters = from spName in db.spReporter() 
       where spName.Subject.Contains(subjectFilter) 
       select new Reporter(spName.Id, spName.InqDate, spName.Subject); 
    e.Result = reporters; 
} 

請通過這個鏈接more info

+1

您的解決方案屬於我所稱的「簡單過濾」 - 我需要的是「動態過濾」,其中過濾器可以包含多個變量,每個變量可以存在一個值或爲null。 –

相關問題