0

Surveyors テーブル (より多くのフィールドを含む) から 3 つのフィールドを取得する EntityDataSource を持つ次の GridView は機能しますが、もちろん、すべての 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 という名前の 2 つのテキスト ボックスがあり、ユーザーが SQL クエリの LIKE スタイルを使用して検索できるようにします。Web でいくつか読んだところ、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 イベントを使用して EntityDataSource に LINQ クエリを適用することです。この場合、おそらくクエリ エクステンダーを宣言的に使用する必要はありません。記事全文はこちら -> 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 に答える