使用RowEditing事件根据ItemTemplate中的值更新Gridview EditTemplate中的CheckBoxList

时间:2013-04-30 17:57:56

标签: asp.net gridview checkboxlist

我有一个gridview'gvAccounts',其中包含'Entitlements'列(以及其他内容)。每个Entitlements单元格包含另一个gridview'gvEntitlements',其中包含每个帐户的权利列表(gvAccounts中的每一行都是一个帐户)。

在Entitlements单元格的EditTemplate中,我有一个CheckBoxList'cblEntitlements',它填充了所有可用的权利。

当我单击编辑时,我希望cblEntitlements只检查那些出现在gvEntitlements中的权利。我在RowEditing事件中尝试了很多东西并且没有任何工作(在行上使用.FindControl时有很多空引用错误),所以我想我会问最好的方法是做什么,而不是粘贴我失败的尝试

谢谢!

标记:

<asp:GridView
    ID="gvAccounts"
    runat="server"
    DataSourceID="AccountsObjectDataSource"
    AllowSorting="True"
    AutoGenerateColumns="False"
    DataKeyNames="CorpID,AppKey"
    Width="100%"
    OnRowDataBound="gvAccounts_RowDataBound"
    OnRowEditing="gvAccounts_RowEditing"
    EnableModelValidation="True" >

    <Columns>

        <asp:TemplateField
            HeaderText="Entitlements"
            SortExpression="Entitlements">

            <ItemTemplate>

                    <asp:GridView
                        ID="gvEntitlements"
                        DataKeyNames="EntitlementID"
                        runat="server"
                        ShowHeader="False" 
                        BorderStyle="None" 
                        EmptyDataText="common" 
                        GridLines="None"
                        AutoGenerateColumns="False">

                        <Columns>
                            <asp:BoundField
                                DataField="EntitlementID" 
                                Visible="false" />

                            <asp:BoundField
                                DataField="Entitlement"/>
                        </Columns>

                    </asp:GridView>

            </ItemTemplate>

            <EditItemTemplate>                         

                <asp:CheckBoxList
                    ID="cblEntitlements"
                    runat="server" 
                    DataSourceID="cblObjectDataSource" 
                    DataTextField="Entitlement" 
                    DataValueField="EntitlementID"
                    RepeatColumns="2" 
                    RepeatDirection="Horizontal">
                </asp:CheckBoxList>

                <asp:ObjectDataSource
                    ID="cblObjectDataSource"
                    runat="server"
                    SelectMethod="GetAppEntitlements"
                    TypeName="CMRPWebApp.Business.CMRPControllerApps">

                    <SelectParameters>
                        <asp:ControlParameter
                            ControlID="DropDownList1"
                            Name="AppKey"
                            PropertyName="SelectedValue"
                            Type="Int32"/>
                    </SelectParameters>

                </asp:ObjectDataSource>

            </EditItemTemplate>

        </asp:TemplateField>

    </Columns>

</asp:GridView>



<asp:ObjectDataSource
    ID="AccountsObjectDataSource"
    runat="server"
    SelectMethod="GetUsersForApp"
    TypeName="CMRPWebApp.Business.CMRPControllerApps"

    <SelectParameters>
        <asp:ControlParameter  
            ControlID="DropDownList1"
            Name="AppKey"
            PropertyName="SelectedValue"
            Type="Int32" />
    </SelectParameters>

</asp:ObjectDataSource>

代码隐藏:

protected void gvAccounts_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //for each row, run a query for that appkey + corp ID to retrieve the entitlements for that account.
        System.Collections.Specialized.IOrderedDictionary datakeyNames = gvAccountsApp.DataKeys[e.Row.RowIndex].Values;
        string corpID = datakeyNames["CorpID"].ToString();
        int appKey = Convert.ToInt32(datakeyNames["AppKey"]);

        if ((e.Row.FindControl("gvEntitlements") as GridView) != null)
        {
            GridView gv = e.Row.FindControl("gvEntitlements") as GridView;
            gv.DataSource = CMRPControllerApps.GetAccountEntitlements(corpID, appKey);
            gv.DataBind();
        }
    }
}

protected void gvAccounts_RowEditing(object sender, GridViewEditEventArgs e)
{
    // ?
}

1 个答案:

答案 0 :(得分:1)

根据我对您的问题的理解,您希望编辑模板显示所有权利,只检查属于特定帐户的权利。

我注意到了几件事:

  1. 在您的代码中,看起来您将名为GridView1的内容绑定到特定帐户的权利列表。我的代码中没有看到任何名称。

  2. 您是否两次绑定到gridview?在您的标记中,我看到您将数据源设置为cblEntitlements。这是您面临的具体问题吗?

  3. 如果我在这里错过了这一点,我很抱歉,只是有点困惑。