具有相同id'** {BehaviorID} **'的两个组件无法添加到应用程序中

时间:2014-09-29 15:26:13

标签: c# asp.net gridview ajaxcontroltoolkit cascadingdropdown

我正在尝试在 GridView 上的 AJAXToolKit 中实施 CascadingDropdown 。 一切正常,下拉菜单获取并填充数据。

但是,当我尝试在下拉列表中添加 BehaviorID 属性时(为了帮助在JavaScript中识别它以便我可以将add_populated()函数绑定到它,它会给我以下错误消息。

  

"具有相同ID的两个组件' {BehaviorID} '无法添加到应用程序中。"

我怀疑是因为应用程序试图为GridVivew中的每个级联下拉列表分配相同的BehaviorID。

有什么想法吗?

ASPX:

<asp:GridView ID="grdTInfo" runat="server" AutoGenerateColumns="False"   onrowdatabound="grdTInfo_RowDataBound" ShowFooter="True"  EnableModelValidation="True"  >
<Columns>
    <asp:TemplateField HeaderText="TDBID" Visible="False">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox8" runat="server" Text='<%# Bind("TSId") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="TSID" runat="server" Text='<%# Bind("TSId") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField HeaderText="SL.No" >
    <ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri" 
        Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="1%" 
        Wrap="False" />
    </asp:BoundField>
    <asp:TemplateField HeaderText="HPname">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("PName") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri" 
        Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="15%" 
        Wrap="False" />
        <ItemTemplate>
            <asp:DropDownList ID="ddlPractice" runat="server" Width="100%">
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="HTName">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("TName") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri" 
        Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="15%" 
        Wrap="False" />
        <ItemTemplate>
            <cc1:DynamicDropDownList ID="ddlTask" runat="server" Width="100%"  
                OnSelectedIndexChanged="ddlTask_SelectedIndexChanged">
            </cc1:DynamicDropDownList>

            <ajaxToolkit:CascadingDropDown ID="ccdTask" runat="server" Category="Task" TargetControlID="ddlTask" PromptText="Select Task" LoadingText="Loading Tasks.." ServiceMethod="BindTaskDetails" ServicePath="CascadingDropdown.asmx">
            </ajaxToolkit:CascadingDropDown>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="STask">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("STName") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri" 
        Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="10%" 
        Wrap="False" />
        <ItemTemplate>

            <cc1:DynamicDropDownList ID="ddlST" runat="server" Width="100%" >
            </cc1:DynamicDropDownList>
            <ajaxToolkit:CascadingDropDown  BehaviorID="abc" ID="ccdST" runat="server" Category="ST" ParentControlID="ddlTask" TargetControlID="ddlST"  PromptText="Select Sub-task" LoadingText="Loading Sub-tasks.." ServiceMethod="BindSTDetails" ServicePath="CascadingDropdown.asmx" >
            </ajaxToolkit:CascadingDropDown >
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

1 个答案:

答案 0 :(得分:1)

经过一番研究,我找到了解决方案。

在创建 GridView 时,我们应该为 GridView 的每一行中创建的每个下拉列表提供唯一的BehaviorID。

因此,我们可以覆盖grdTInfo_RowCreated事件,为每个下拉列表分配唯一的BehaviorID,如下所示

 protected void grdvTimelogInfo_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // Programmatically reference the PopupControlExtender
            CascadingDropDown cc1 = e.Row.FindControl("ccdTask") as CascadingDropDown;
            CascadingDropDown cc2 = e.Row.FindControl("ccdST") as CascadingDropDown;

            // Set the BehaviorID
            string behaviorID = string.Concat("cc1", e.Row.RowIndex);
            cc1.BehaviorID = behaviorID;

            string behaviorID2 = string.Concat("cc2", e.Row.RowIndex);
            cc2.BehaviorID = behaviorID2;
        }
    }