2

さて、私は ASP WebForms を使用しており、別の ListView (アカウント用) 内に ListView (アカウント顧客用) を持っています。

この内側の ListView には、アカウントの顧客 (この特定のアプリケーションでは参加者と呼ばれます) の ObjectDataSource があります。

ここにあります:

<asp:ObjectDataSource ID="dataSourceParticipants" runat="server" 
SelectMethod="GetParticipantsForAccount"
UpdateMethod="UpdateParticipantDetails"
DeleteMethod="DeleteParticipantDetails"
InsertMethod="InsertParticipantDetails"
TypeName="PreScreening2.AccountManagerWrapper"
DataObjectTypeName="PreScreening2.BLL.Models.Participant">
    <SelectParameters>
        <asp:ControlParameter ControlID="grdAccounts" Name="accountNumber" PropertyName="SelectedDataKey.Values[AccountNumber]"
            Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

そして、これが私の AccountManagerWrapper クラスです (名前が不十分です):

public class AccountManagerWrapper
{
    [Inject]
    public IAccountManager AccountManager { get; set; }

    [Inject]
    public IParticipantManager ParticipantManager { get; set; }

    public IEnumerable<Participant> GetParticipantsForAccount(string accountNumber)
    {
        return AccountManager.GetParticipantsForAccount(accountNumber);
    }

    public bool UpdateParticipantDetails(Participant participant)
    {
        return ParticipantManager.UpdateParticipantDetails(participant, null, AccountManager);
    }

    public bool DeleteParticipantDetails(Participant participant)
    {
        return ParticipantManager.DeleteParticipant(participant, null, AccountManager);
    }

    public bool InsertParticipantDetails(Participant participant)
    {
        return ParticipantManager.UpdateParticipantDetails(participant, null, AccountManager);
    }
}

私の外側の ListViewのItemDataBoundイベントで、私はこれをやっています:

protected void grdAccounts_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        var dataItem = e.Item as ListViewDataItem;
        if (dataItem != null)
        {
            var parentID = ((BLL.Models.Account)dataItem.DataItem).AccountNumber;

            var sqlParts = (ObjectDataSource)e.Item.FindControl("dataSourceParticipants");

            if (sqlParts != null)
            {
                var parameterParentID = sqlParts.SelectParameters[0];
                parameterParentID.DefaultValue = parentID;
            }
        }
    }
}

これは完全に機能します。この行より上のすべてが 100% 機能することを明確にすることが重要です。すべてのメソッドは、私がやりたいことを正確に実行します。

UpdateParticipantDetailsメソッドを次のように更新します。

    public bool UpdateParticipantDetails(Participant participant, string accountNumber)
    {
        return ParticipantManager.UpdateParticipantDetails(participant, accountNumber, AccountManager);
    }

上記のSelectParametersControlParameterのPropertyNameとして使用しているのと同じAccountNumberプロパティをこのメソッドに渡したいと思います。

この新しい値を Update メソッドに渡すには、 dataSourceParticipantsの HTML に何を追加する必要がありますか?

私はこれを試しました:

<UpdateParameters>
    <asp:ControlParameter ControlID="grdAccounts" Name="participant"/>
    <asp:ControlParameter ControlID="grdAccounts" Name="accountNumber" PropertyName="SelectedDataKey.Values[AccountNumber]" Type="String"/>
</UpdateParameters>

Resharper は私にこのエラーを与えます:

パラメータの数が正しくありません

更新しようとすると、次の実行時エラーが発生します。

ObjectDataSource 'dataSourceParticipants' は、タイプ 'PreScreening2.BLL.Models.Participant' のパラメーターを受け取る非ジェネリック メソッド 'UpdateParticipantDetails' を見つけることができませんでした。

ありがとう

4

0 に答える 0