全て、
参考:VS2005、.net2.0を使用しています。
FormViewEditItemTemplateに存在するGridViewコントロールがあります。残念ながら、GridViewはその設定で誤動作し、ページがポストバックしてグリッドビューのselectコマンドが起動すると、そのDataKeysコレクションは空になります。
イベントのシーケンスは次のとおりです。
- ユーザーがページを閲覧する
- ユーザーが「編集」をクリックします(FormViewはGridViewがある場所にEditItemTemplateをレンダリングします)
- ユーザーは検索をクリックして再度ポストバックし、EditItemTemplateにあるGridViewにデータを入力します(この時点でGridViewにはDataKeysがあります)
- ユーザーがGridViewからアイテムを選択すると、行選択イベントが発生します
- ポストバック時に、GridViewRowCommandが起動します。-CommandName="select"を確認し、この時点でDataKeysコレクションが空であるため、例外をスローするコードを実行します。
もう1つの詳細:GridViewは、FormViewのEditItemTemplateにあるユーザーコントロールにあります。
ノート:
GridViewをFormViewのEditItemTemplateから移動すると、この問題を解決できました。現在、DataKeysコレクションは空ではありません。残念ながら、ユーザーが検索したクライアントを選択するには、GridViewをEditItemTemplateに含める必要があります。
任意の洞察をいただければ幸いです。
イベント処理コード:
protected void ctlSearchResults_RowCommand(object sender, GridViewCommandEventArgs e)
{
// user has selected the client from the keyword search result list
if (e.CommandName == "select")
{
GridView searchResultsGrid = (GridView)e.CommandSource;
int selectedRowIndex = int.Parse((string)e.CommandArgument);
int clientId = (int)searchResultsGrid.DataKeys[selectedRowIndex][Client.PROP_ENTITYID];
// raise Selected event
_OnSelected(new ClientSelectedEventArgs(clientId));
}
}