4

インターフェイスを取る List<> を取る gridview がある C# Web アプリがあります。リスト内にあるインターフェイスを実装する 3 つのオブジェクト タイプがあります。

gridviews データソースをリストに設定し、databind を呼び出します。アプリを実行すると、次のエラーが表示されます。

{"Property accessor 'Name' on object 'Bailey.Objects.Company' threw the following exception:'Object does not match target type.'"}

リスト内のオブジェクトの順序を変更したところ、最初のオブジェクト タイプは問題なく動作することがわかりましたが、別のオブジェクトの最初のインスタンスが見つかると、このエラーがスローされます。

List<IBaileyObject> listToDisplay = listofItems;
GridViewItemList.DataSource = listToDisplay;
GridViewItemList.DataBind();

私が望んでいたのは、データソースとバインディングが、実際に起こっているように見えるようにオブジェクトにキャストするのではなく、インターフェースにとどまることでした。

これは、List<> がオブジェクトをインターフェイスではなくそれ自体として返しているためですか、それともグリッドビューにキャストされているものですか?

それとも間違った道を進んでいますか?

誰かがこれを修正する方法を持っていることを願っています。

ありがとう

ジョン・ホーキンス

編集

     <asp:TemplateField HeaderText="Selected">
                    <ItemTemplate>
                        <asp:CheckBox runat="server" ID="chkbox" Width="10%" Enabled="true" AutoPostBack="false" />
                    </ItemTemplate>
                </asp:TemplateField>

    <asp:BoundField DataField="ID" HeaderText="ID" Visible="False" />
    <asp:BoundField DataField="Name" HeaderText="Name" />
    <asp:BoundField DataField="TypeName" HeaderText="Type" />
</Columns>
<FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#E3EAEB" />    

<PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#7C6F57" />
<AlternatingRowStyle BackColor="#F8F8F8" />    

インターフェイスは、Name、ID、および TypeName を公開します。

" HeaderText="ID" Visible="False" />

Gives はインデクサーを適用できません。

4

3 に答える 3

3

私はこのソリューションが本当に好きです: http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

Eval を使用して値を返すカスタム BoundField クラスを使用します。ASPX ページで Evals を使用するよりも少し便利です...

于 2010-01-06T16:01:33.033 に答える
1

GridView コードの一部 (特に IBaileyObject プロパティを参照する場所) を投稿できますか?

使用している構文がわからないと作業が難しくなりますが、次のようなことを試しましたか?

<%# (((IBaileyObject)Container.DataItem)["PropertyX"]) %>

お役に立てれば

コード投稿後に編集

「BoundField」を使用しているためだと思います-参照しているメンバーがどこから来たのかを理解するほど賢くありません。私のアドバイスは、BoundFields をデータバインディング構文に変換することです。

次のいずれか:<%# Eval("Id") %> または、<%# (((IBaileyObject)Container.DataItem)["Id"]) %>

それができない場合は、このブログ投稿のアドバイスに従って、カスタム バインド フィールド コントロールを作成してください。

于 2009-03-27T13:34:16.250 に答える
0
GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              {
                                  Id = x.Id,
                                  Name = x.Name                        
                              })
                              .ToList();
GridViewItemList.DataBind();
于 2015-02-26T03:35:32.120 に答える