さて、私は 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);
}
上記のSelectParametersでControlParameterの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' を見つけることができませんでした。
ありがとう