2

全て、

参考:VS2005、.net2.0を使用しています。

FormViewEditItemTemplateに存在するGridViewコントロールがあります。残念ながら、GridViewはその設定で誤動作し、ページがポストバックしてグリッドビューのselectコマンドが起動すると、そのDataKeysコレクションは空になります。

イベントのシーケンスは次のとおりです。

  1. ユーザーがページを閲覧する
  2. ユーザーが「編集」をクリックします(FormViewはGridViewがある場所にEditItemTemplateをレンダリングします)
  3. ユーザーは検索をクリックして再度ポストバックし、EditItemTemplateにあるGridViewにデータを入力します(この時点でGridViewにはDataKeysがあります)
  4. ユーザーがGridViewからアイテムを選択すると、行選択イベントが発生します
  5. ポストバック時に、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));
    }
}
4

3 に答える 3

1

DataKeyコレクションが空である理由は、検索結果グリッドビューのデータバインディングの前にコレクションにアクセスしているためです。このガイドは、処理の問題の順序をデバッグするときに役立ちます。

于 2013-04-04T13:00:26.933 に答える
0

次のように、送信者をGridViewに変換したいと思います。

GridView searchResultsGrid = sender as GridView;
于 2013-03-07T18:43:08.950 に答える
-1

これを試して:

int selectedRowIndex = Convert.ToInt32(e.CommandArgument);
int clientId = Convert.ToInt32(this.yourGridView.DataKeys[selectedRowIndex]["yourDataKey"].Value);
于 2013-03-07T18:35:40.137 に答える