2

全部,

仅供参考:我使用的是 VS2005,.net 2.0。

我有一个存在于 FormView EditItemTemplate 中的 GridView 控件。不幸的是,GridView 在该设置中行为不端,当页面回发并且触发 gridview 的选择命令时,其 DataKeys 集合为空。

以下是事件的顺序:

  1. 用户浏览页面
  2. 用户单击“编辑”(FormView 呈现 GridView 所在的 EditItemTemplate)
  3. 用户单击再次回发的搜索并填充位于 EditItemTemplate 中的 GridView(此时 GridView 具有 DataKeys)
  4. 用户从引发行选择事件的 GridView 中选择项目
  5. 在回发时,GridView RowCommand 触发,-我检查 CommandName = "select" 并运行我的代码,该代码抛出异常,因为此时 DataKeys 集合为空!

另一个细节: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 集合为空的原因是您在搜索结果gridview 的数据绑定之前访问该集合。我发现指南在调试处理问题的顺序时很有用。

于 2013-04-04T13:00:26.933 回答
0

我相信您想将 sender 转换为 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 回答