【问题标题】:Using RowEditing event to update CheckBoxList in Gridview EditTemplate, based on value in ItemTemplate使用 RowEditing 事件根据 ItemTemplate 中的值更新 Gridview EditTemplate 中的 CheckBoxList
【发布时间】:2013-04-30 17:57:56
【问题描述】:

我有一个网格视图“gvAccounts”,其中有一列“权利”(除其他外)。每个权利单元格包含另一个网格视图“gvEntitlements”,其中包含每个帐户的权利列表(gvAccounts 中的每一行都是一个帐户)。

在权利单元格的 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)
{
    // ?
}

【问题讨论】:

  • 我认为我们需要更多信息来提供帮助。就目前而言,这个问题本质上太笼统了。您可以为两个 GridView 发布您的标记吗?另外,请提供两个 GridView 的 DataBinding 代码。
  • 好的 - 添加了代码。我试图修剪脂肪,只留下相关代码,所以希望没有遗漏任何东西。

标签: asp.net gridview checkboxlist


【解决方案1】:

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

我注意到的几件事:

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

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

如果我在这里遗漏了重点,我很抱歉,只是有点困惑。

【讨论】:

  • 对不起,GridView1 是一个错字——我在这里更改了 gridview 名称以便更容易理解,但我错过了这 2 个。它的工作原理如下:(1)用户从下拉列表中选择一个应用程序,然后使用 AccountsObjectDataSource 绑定 gvAccounts,然后 (2):在 gvAccounts 中每一行的 RowDataBound 事件中,每个 gvEntitlements 都绑定到该特定帐户。
  • 到你的第一段;是的,这正是我希望它工作的方式。我认为我遇到的问题是如何从 gvAccounts_RowEditing 事件中的 ItemTemplate 和 EditTempalte 访问控件。似乎它只允许我访问 ItemTemplate,因此在尝试从 EditTemplate 访问 CheckBoxList 时出现空对象错误。
  • 我想用更简洁的方式来表达我的问题是:“如何将在 RowEditing 事件中检索到的值传递给 EditTemplate?”
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 2012-10-21
相关资源
最近更新 更多