当GridView在EditItemTemplate中时,GridView DataKeys集合为空

时间:2013-03-07 16:09:02

标签: asp.net .net gridview

所有

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

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

以下是事件序列:

  1. 用户浏览页面
  2. 用户点击“编辑”(FormView呈现GridView所在的EditItemTemplate)
  3. 用户再次点击搜索哪个回发并填充位于EditItemTemplate中的GridView(此时GridView具有DataKeys)
  4. 用户从GridView中选择提升行选择事件的项目
  5. 在回发时,GridView RowCommand触发, - 我检查CommandName =“select”并运行我抛出异常的代码,因为此时DataKeys集合为空!
  6. 还有一个细节: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));
        }
    }
    

3 个答案:

答案 0 :(得分:0)

我相信您希望将发件人转换为GridView,如下所示:

GridView searchResultsGrid = sender as GridView;

答案 1 :(得分:0)

DataKey集合为空的原因是您在搜索结果gridview的数据绑定之前访问该集合。我发现this指南在调试处理问题的顺序时很有用。

答案 2 :(得分:-1)

  

试试这个:

int selectedRowIndex = Convert.ToInt32(e.CommandArgument);
int clientId = Convert.ToInt32(this.yourGridView.DataKeys[selectedRowIndex]["yourDataKey"].Value);