0

以下带有 EntityDataSource 的 GridView 可以从 Surveyors 表(包含更多字段)中获取 3 个字段,但它当然向我展示了每个 Surveyor。

<asp:GridView ID="gvwSurveyors" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" DataSourceID="edsSurveyors">
  <Columns>
    <asp:BoundField DataField="FirstName" HeaderText="FirstName" ReadOnly="True" SortExpression="FirstName" />
    <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" />
    <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" SortExpression="ID" />
  </Columns>
</asp:GridView>
<asp:EntityDataSource ID="edsSurveyors" runat="server"
  ConnectionString="name=PLSOEntities"
  DefaultContainerName="PLSOEntities"
  EnableFlattening="False"
  EntitySetName="Surveyors"
  Select="it.[FirstName], it.[LastName], it.[ID]"
  AutoGenerateOrderByClause="true">
  <OrderByParameters>
    <asp:Parameter DefaultValue="LastName" />
  </OrderByParameters>
</asp:EntityDataSource>

因此,为了使初始页面加载不显示所有内容,我将 OnSelecting 事件添加到 EntityDataSource 并让它取消查询,如果它不是回发。

protected void edsSurveyors_Selecting(object sender, EntityDataSourceSelectingEventArgs e) {
  if (!Page.IsPostBack)
    e.Cancel = true;
}

我有两个名为 txtFirstName 和 txtLastName 的文本框,我希望用户能够使用 SQL 查询 LIKE 样式进行搜索。网上的一些阅读将我引向了 QueryExtender。我将代码更改为以下内容:

<asp:GridView ID="gvwSurveyors" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" DataSourceID="edsSurveyors">
  <Columns>
    <asp:BoundField DataField="FirstName" HeaderText="FirstName" ReadOnly="True" SortExpression="FirstName" />
      <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" />
      <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" SortExpression="ID" />
    </Columns>
  </asp:GridView>
  <asp:EntityDataSource ID="edsSurveyors" runat="server"
    ConnectionString="name=PLSOEntities"
    DefaultContainerName="PLSOEntities"
    EnableFlattening="False"
    EntitySetName="Surveyors"
    Select="it.[FirstName], it.[LastName], it.[ID]"
    AutoGenerateOrderByClause="true" onselecting="edsSurveyors_Selecting">
    <OrderByParameters>
      <asp:Parameter DefaultValue="LastName" />
    </OrderByParameters>
  </asp:EntityDataSource>
  <asp:QueryExtender ID="qexSurveyor" runat="server" TargetControlID="edsSurveyors">
    <asp:SearchExpression SearchType="Contains" DataFields="FirstName">
      <asp:ControlParameter ControlID="txtFirstName" />
    </asp:SearchExpression>
  </asp:QueryExtender>

所以现在当我单击按钮时,我收到错误:'FirstName' 不是'System.Data.Common.DbDataRecord' 类型的成员

我可以做些什么来允许包含?一旦它工作,我将添加一个相同的 LastName 参数。

4

2 回答 2

1

在使用 AdventureWorks 作为数据源时,我也遇到了同样的事情。我必须从我的 EntityDataSource 中删除“Select=”。对于解决方法,我去了我的 GridView 并设置 AutoGenerateColumns="False"。然后我手动添加了我想在 Gridview 中显示的每一列,例如

        <asp:BoundField DataField="CustomerID" HeaderText="Customer ID" />
        <asp:BoundField DataField="SalesPerson" HeaderText="Sales Person" />
        <asp:BoundField DataField="CustomerID" HeaderText="Customer ID" />
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
        <asp:BoundField DataField="LastName" HeaderText="Last Name" />
        <asp:BoundField DataField="CompanyName" HeaderText="Company Name" />
        <asp:BoundField DataField="EmailAddress" HeaderText="Email Address" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" />

作为附加说明,似乎另一种解决方法(尽管是以编程方式)是使用 onquerycreated 事件将 LINQ 查询应用于 EntityDataSource。在这种情况下,您不需要以声明方式使用查询扩展器。全文在这里-> http://msdn.microsoft.com/en-us/library/ee404748.aspx

于 2012-01-10T18:20:39.830 回答
0

我目前遇到了同样的问题,到目前为止,我发现如果我从 EntityDataSource 中删除 'Select=' ,它就可以工作。显然,您在使用 QueryExtender 时必须全选。但是,我不想返回表中的每个字段,而且我还没有找到解决方法。

那么,有人有解决方法吗?

于 2011-09-23T12:40:34.837 回答